【问题标题】:Catching 404s (and other server errors?) using Filter使用过滤器捕获 404(和其他服务器错误?)
【发布时间】:2014-03-05 19:41:11
【问题描述】:

我不确定这里是否已经问过这个问题,我能找到的最好的重复是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 的子类)和运行时发生的任何其他异常(空指针等)以显示错误页面——它运行良好。

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

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

只是好奇这件事。

【问题讨论】:

    标签: java servlets jetty servlet-filters


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-04
      • 2013-07-04
      • 2020-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多