实际上,我对Java EE规范还很陌生,因为我有点年轻。我在学校从来没有学过这些东西,我正面临着doFilter
方法的怪异行为。
考虑以下过滤器:
@WebFilter(filterName = "URLFilter", value = "/test")
public class URLFilter implements Filter {
public void destroy() {}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
HttpServletResponse response = (HttpServletResponse) resp;
if (response.getStatus() == HttpServletResponse.SC_NOT_FOUND)
response.sendRedirect("/");
chain.doFilter(req, resp);
}
public void init(FilterConfig config) throws ServletException {}
}
/test
中不存在servlet或页面,在我的浏览器中,访问URL时的状态显然是404 not found
错误,因此应该是getStatus()
方法返回给我的值,而不是。(实际上具有200
状态代码(
为什么我的过滤器没有按要求将我重定向到/
?我是否误解了Filters
的一般用法?
更新:
我的问题是当找不到页面时重定向客户端(使用sendRedirect()
(。我不理解过滤器部分,因为当调用chain.doFilter()
时,我不知道resp
和req
实际上填充了新数据。(实际上我觉得很奇怪,因为doFilter正在调用COR模式链接的下一个Filter(
我已经创建了一个继承HttpServletResponseWrapper
的类,实现了它,并将它传递给Filter,现在它工作得很好。
在尝试访问位于/test
的实际资源(servlet、页面、文件等(之前,会调用过滤器。因此,此时的响应状态还不能是404。
然后您的过滤器调用chain.doFilter((,从而告诉容器实际为/test
的资源提供服务。由于没有这样的资源,您会得到404。