使用Filter捕获404s(以及其他服务器错误?)

时间:2014-02-08 08:46:41

标签: java servlets jetty servlet-filters

我不确定这里是否已经提出过这个问题,我能找到的最好的重复是Servlet Filter url-mapping /* is not working on 404 errors

但这并不能解决我的问题。

我正在使用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的子类)以及在运行时发生的任何其他异常(空指针等)以显示错误页面 - 它工作正常。< / p>

但由于某种原因,我的过滤器不会被调用404s。 我也尝试了web.xml方法,如我所链接的问题所述,但这也不起作用。

我是Java的新手以及所有这些东西......我可能在这里尝试了错误的东西,但如果过滤器不应该捕获各种错误,那么DispatcherType.ERROR的用途到底是什么?我知道可以按照http://www.eclipse.org/jetty/documentation/current/custom-error-pages.html

中的说明配置自定义错误页面 只是好奇这件事。

1 个答案:

答案 0 :(得分:0)

所以,问题是,404并不是一个例外。当我在DispatcherType.ERROR中设置<error-page>时,会调用标有web.xml的过滤器。