gpt4 book ai didi

java - 对 doFilter 方法可能的误解

转载 作者:行者123 更新时间:2023-12-01 09:21:36 25 4
gpt4 key购买 nike

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

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

最佳答案

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

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com