doFilter方法可能存在误解



实际上,我对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()时,我不知道respreq实际上填充了新数据。(实际上我觉得很奇怪,因为doFilter正在调用COR模式链接的下一个Filter(

我已经创建了一个继承HttpServletResponseWrapper的类,实现了它,并将它传递给Filter,现在它工作得很好。

在尝试访问位于/test的实际资源(servlet、页面、文件等(之前,会调用过滤器。因此,此时的响应状态还不能是404。

然后您的过滤器调用chain.doFilter((,从而告诉容器实际为/test的资源提供服务。由于没有这样的资源,您会得到404。

最新更新