为所有 404 响应制作 servlet 过滤器
Make servlet filter for all 404 responses
当 404 是对 return 静态 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>
但是过滤器
您是否尝试过在 web.xml
中使用 <error-page>
元素?
我认为这是一个很好的替代方案——只有配置,没有代码。
以下是如何执行此操作的示例:
<error-page>
<error-code>404</error-code>
<location>pages/PageNotFound.html</location>
</error-page>
您在处理请求之前(以及设置 404 错误之前)测试状态代码。
所以调用后需要测试状态码filterChain.doFilter(request, response);
但这也行不通,因为当调用 response.sendError(404)
时响应已提交,您无法重定向。
因此最好使用<error-page>
机制。
您需要先调用过滤器链,然后再检查响应。
您可以在过滤器中重定向。您只需要确保 之后不调用 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);
}
当 404 是对 return 静态 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>
但是过滤器
您是否尝试过在 web.xml
中使用 <error-page>
元素?
我认为这是一个很好的替代方案——只有配置,没有代码。 以下是如何执行此操作的示例:
<error-page>
<error-code>404</error-code>
<location>pages/PageNotFound.html</location>
</error-page>
您在处理请求之前(以及设置 404 错误之前)测试状态代码。
所以调用后需要测试状态码filterChain.doFilter(request, response);
但这也行不通,因为当调用 response.sendError(404)
时响应已提交,您无法重定向。
因此最好使用<error-page>
机制。
您需要先调用过滤器链,然后再检查响应。
您可以在过滤器中重定向。您只需要确保 之后不调用 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);
}