因为我还很年轻,所以我实际上对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()
)。我不了解过滤器部分,因为当调用resp
时,我不知道req
和chain.doFilter()
实际上是否充满了新数据。 (由于doFilter调用了由COR模式链接的下一个Filter,我实际上发现这很奇怪)我做了一个继承
HttpServletResponseWrapper
的类,实现了它,并将其传递给Filter,现在可以正常工作了。 最佳答案
在尝试访问位于/test
的实际资源(servlet,页面,文件等)之前,将调用过滤器。因此,此时的响应状态还不能为404。
然后,您的过滤器调用chain.doFilter(),从而告诉容器实际在/test
提供资源。由于没有此类资源,因此您得到404。
关于java - 对doFilter方法的可能误解,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40136168/