【问题标题】:Make servlet filter for all 404 responses为所有 404 响应制作 servlet 过滤器
【发布时间】:2016-05-15 15:09:19
【问题描述】:

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

@WebFilter("/*")
public class PageNotFoundFilter implements Filter {

    @Override
    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");
        }
        filterChain.doFilter(request, response);

    }

但是什么都没有发生,为什么?

注意:我不想使用:

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

但过滤

【问题讨论】:

  • 你能发布你的 web.xml 吗?
  • 您是否调试或放置了日志语句以查看您的过滤器是否被调用?
  • 我没有 web.xml

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


【解决方案1】:

您是否尝试过在web.xml 中使用&lt;error-page&gt; 元素?

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

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

【讨论】:

    【解决方案2】:

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

    所以你需要在调用filterChain.doFilter(request, response);之后测试状态码

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

    因此最好使用&lt;error-page&gt;机制。

    【讨论】:

    • 如果我这样做:提交响应后我有 500 个 sendRedirect()
    • 这就是为什么应该使用&lt;error-page&gt;的原因。提交响应后,您将无法更改其标题。
    • 那么没有办法使用过滤器来捕捉404?
    • 是的,我检查了顺序,过滤器是在请求处理之前调用的。谢谢。我需要带有错误页面的 web.xml。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      您可以在过滤器中重定向。您只需要确保之后不调用 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);
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-17
        • 1970-01-01
        • 2015-11-11
        • 2011-12-18
        • 1970-01-01
        • 2014-09-18
        • 1970-01-01
        • 2023-03-20
        相关资源
        最近更新 更多