Java 使用筛选器捕获404(和其他服务器错误?)

Java 使用筛选器捕获404(和其他服务器错误?),java,servlets,jetty,servlet-filters,Java,Servlets,Jetty,Servlet Filters,我不确定这个问题是否已经在这里被问过,我能找到的最好的副本是 但这并不能解决我的问题 我使用的是Jetty 9,我有一个类似这样的过滤器- @WebFilter(dispatcherTypes = { DispatcherType.REQUEST, DispatcherType.ERROR }, urlPatterns = { "/*" }) public class ErrorHandler implements Filter { public void destroy() {

我不确定这个问题是否已经在这里被问过,我能找到的最好的副本是

但这并不能解决我的问题

我使用的是Jetty 9,我有一个类似这样的过滤器-

@WebFilter(dispatcherTypes = { DispatcherType.REQUEST, DispatcherType.ERROR }, urlPatterns = { "/*" })
public class ErrorHandler implements Filter {

    public void destroy() {
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        int errorcode = HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
        String message = "";
        boolean error = false;

        StringWriter sw_stacktrace = new StringWriter();
        PrintWriter pw_stacktrace = new PrintWriter(sw_stacktrace);

        try {
            chain.doFilter(request, response);
        } catch (AppException e) {
            errorcode = e.getCode();
            error = true;
            message = e.getMessage();
            e.printStackTrace(pw_stacktrace);
        } catch (Throwable t) {
            error = true;
            message = "Unknown Error";
            t.printStackTrace(pw_stacktrace);
        }

        if (!response.isCommitted()) {
            if (error) {
                if (errorcode == HttpServletResponse.SC_INTERNAL_SERVER_ERROR) {
                    String log = String.format("Error %d Occurred - \n %s \n Stack Trace - \n %s", errorcode, message, sw_stacktrace.toString());
                    request.getServletContext().log(log);
                }

                HttpServletResponse resp = (HttpServletResponse) response;
                resp.setStatus(errorcode);
                request.setAttribute("errorMessage", message);
            } else {
                request.setAttribute("errorMessage", request.getAttribute("javax.servlet.error.message"));
            }
            request.getRequestDispatcher("/WEB-INF/templates/error/" + errorcode + ".jsp").forward(request, response);          
        }
        pw_stacktrace.close();
    }

    public void init(FilterConfig fConfig) throws ServletException {

    }
}
我使用它捕获ServletException的自定义异常类型子类,以及在运行时null指针等期间发生的任何其他异常,以显示错误页面—它工作得非常好

但是由于某些原因,我的过滤器没有被404调用。 正如我链接的问题中提到的那样,我也尝试了web.xml方法,但这也不起作用

我对Java和所有这些东西都是新手。。我可能在这里尝试了错误的东西,但是如果筛选器不应该捕获所有类型的错误,那么DispatcherType.ERROR的具体用途是什么?我知道可以按照中所述配置自定义错误页


只是好奇而已。

所以,问题是,404并不是一个例外。在web.xml中设置时,将调用标记为DispatcherType.ERROR的筛选器