因为我还很年轻,所以我实际上对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时,我不知道reqchain.doFilter()实际上是否充满了新数据。 (由于doFilter调用了由COR模式链接的下一个Filter,我实际上发现这很奇怪)

我做了一个继承HttpServletResponseWrapper的类,实现了它,并将其传递给Filter,现在可以正常工作了。

最佳答案

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

然后,您的过滤器调用chain.doFilter(),从而告诉容器实际在/test提供资源。由于没有此类资源,因此您得到404。

关于java - 对doFilter方法的可能误解,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40136168/

10-09 03:42