可能误解了doFilter方法

时间:2016-10-19 15:48:06

标签: java java-ee servlet-filters

我实际上是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,它现在工作正常。

1 个答案:

答案 0 :(得分:1)

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

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