我实际上是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
错误,因此应该是{{1}返回给我的值不是的方法。 (实际上有一个getStatus()
状态代码)
为什么我的过滤器没有按要求将我重定向到200
?我是否误解了/
的使用?
更新:
我的问题是在找不到页面时重定向客户端(使用Filters
)。我不理解过滤器部分,因为我不知道sendRedirect()
和resp
实际上在调用req
时填充了新数据。 (实际上我发现这很奇怪,因为doFilter正在调用由COR模式链接的下一个Filter)
我已经创建了一个继承chain.doFilter()
的类,实现了它,将它传递给Filter,它现在工作正常。
答案 0 :(得分:1)
在尝试访问位于/test
的实际资源(servlet,页面,文件等)之前,会调用您的过滤器。因此,目前响应状态不能是404。
然后你的过滤器调用chain.doFilter(),从而告诉容器实际为/test
的资源提供服务。由于没有这样的资源,你得到404。