Java 对所有404响应进行servlet筛选

Java 对所有404响应进行servlet筛选,java,servlets,filter,http-status-code-404,Java,Servlets,Filter,Http Status Code 404,当404是返回静态html页面的响应状态时,我想创建一个扩展javax.filter的自定义过滤器。但它不起作用,我想知道为什么。 这是我的过滤器: @WebFilter("/*") public class PageNotFoundFilter implements Filter { @Override public void doFilter(final ServletRequest request, final ServletResponse response, fina

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

@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>

404
/pages/PageNotFound.html

但是Filter

您是否尝试过在
web.xml
中使用
元素

我认为这是一个很好的替代方案-只配置,没有代码。 下面是一个如何做到这一点的示例:

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

404
pages/PageNotFound.html

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

因此,在调用
filterChain.doFilter(请求、响应)之后,需要测试状态代码

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


因此,最好使用
机制。

在检查响应之前,您需要先调用筛选器链。

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

你能发布你的web.xml吗?你有没有调试或放置日志语句以查看你的筛选器是否被调用?我没有web.xml如果我这样做:我有500个sendRedirect()在响应提交后这就是为什么应该使用
。一旦一个响应被提交,你就不能改变它的头。所以没有办法用过滤器捕捉404?是的,我检查了序列,过滤器在请求处理之前被调用。谢谢我需要有错误页面的web.xml。