2016-02-05 78 views
1

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

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

但过滤

+0

你可以发布你的web.xml吗? – Samuel

+0

您是否调试过或放置了日志记录语句以查看您的过滤器是否被调用? – Samuel

+0

我没有web.xml – Xelian

回答

1

您测试状态码处理请求之前(和之前设置的404错误)。

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

后,但是,这将无法工作或者是因为当response.sendError(404)被称为响应承诺,你不能重定向。

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

+0

如果我这样做:我有500 sendRedirect()在响应提交后 Xelian

+0

这就是为什么应该使用''的原因。一旦提交了响应,您将无法更改其标题。 – wero

+0

那么有没有办法捕捉404使用过滤器? – Xelian

1

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

我认为这是一个很好的替代方案 - 只有配置,没有代码。 这里是你如何能做到这样一个例子:

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

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