为所有404响应制作servlet过滤器

时间:2016-02-05 15:19:07

标签: java servlets filter http-status-code-404

我想制作一个自定义过滤器,它扩展了javax.filter,当404是返回静态html页面的响应状态时。但它不起作用,我想知道为什么。 这是我的过滤器:

<error-page>
  <error-code>404</error-code>
  <location>/pages/PageNotFound.html</location>
</error-page>

但没有任何反应,为什么?

注意:我不想使用:

automap::autoKrige

但过滤器

4 个答案:

答案 0 :(得分:1)

您是否尝试过使用<error-page>中的web.xml元素?

我认为它是一个很好的替代方案 - 只有配置,没有代码。 以下是如何执行此操作的示例:

<error-page>
    <error-code>404</error-code>
    <location>pages/PageNotFound.html</location>
</error-page>

答案 1 :(得分:1)

您在处理请求之前(以及设置404错误之前)测试状态代码。

因此,您需要在调用filterChain.doFilter(request, response);

后测试状态代码

但这不起作用,因为当调用response.sendError(404)时,响应已提交且您无法重定向。

因此,最好使用<error-page>机制。

答案 2 :(得分:0)

在检查响应之前,您需要先调用过滤器链

答案 3 :(得分:0)

您可以在过滤器中重定向。您只需要确保此后不调用filterChain.doFilter()。如果这样做,即使您已经在响应上设置了导致上述错误的重定向,也会导致链继续请求。

正确执行过滤器将是:

    public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain filterChain)
        throws IOException, ServletException {
    HttpServletResponse httpResponse = (HttpServletResponse) response;
    if (httpResponse.getStatus() == 404) {
        httpResponse.sendRedirect("pages/PageNotFound.html");
    } else {
        filterChain.doFilter(request, response);
    }