gpt4 book ai didi

java - 实现 URL 过滤器

转载 作者:行者123 更新时间:2023-11-28 22:58:44 28 4
gpt4 key购买 nike

带有 ServletFilter 的嵌入式 Tomcat 的简单实例:

            Tomcat tomcat = new Tomcat();
Context rootCtx = tomcat.addContext("", base.getAbsolutePath());
FilterDef filterDefinition = new FilterDef();
filterDefinition.setFilterName(URLFilter.class.getSimpleName());
filterDefinition.setFilterClass(URLFilter.class.getName());
rootCtx.addFilterDef(filterDefinition);

FilterMap filter1mapping = new FilterMap();
filter1mapping.setFilterName(URLFilter.class.getSimpleName());
filter1mapping.addURLPattern("/*");
rootCtx.addFilterMap(filter1mapping);

Tomcat.addServlet(rootCtx, "Servlet1", new Servlet1());
rootCtx.addServletMapping("/Servlet1", "Servlet1");

URL 过滤器实现:

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
Boolean filtered = false;
System.out.println("request intercepted");
if (request.getAttribute("filtered") != null) {
filtered = true;
request.setAttribute("filtered", filtered);
HttpServletResponse httpResponse = (HttpServletResponse) response;
httpResponse.sendRedirect("/Servlet1");
return;
} else {
filterChain.doFilter(request, response);
}
}

出于某种原因,这会以无限循环结束,永远不会到达 Servlet1。实现 URL 过滤器的正确方法是什么,以便我可以在传递响应之前仔细检查请求周围的参数?

最佳答案

查看 sendRedirect() 的 JavaDocs .您在每个请求 上告诉客户端返回到/Servlet1,但随后您无限期地过滤它。在某些时候,您需要停止在过滤器中发送重定向!

再澄清一些。如果您不打算主动过滤请求,您唯一需要做的就是调用

filterChain.dofilter(request, response);

除非您真的要发送 HTTP 302(临时重定向),否则不要发回重定向。 Servlet 过滤器链是 servlet 进程的重要组成部分,虽然它可能看起来违反直觉,但您可以通过调用 filterChain.doFilter 命令使您的过滤器看起来什么都不做,它允许请求继续到您配置的其他过滤器应用服务器。

我不清楚你的过滤器试图做什么。如果您打算按 URL 进行过滤,那么您应该查找匹配的 URL,然后仅在匹配时才重定向。

关于java - 实现 URL 过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22690905/

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