java - 实现 URL 过滤器

标签 java tomcat servlets embedded-tomcat-7 tomcat8

带有 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/

相关文章:

java - 如何将Eclipse中的tomcat配置迁移到Intellij Idea?

spring - 如何在 spring boot 2.1.9 中配置 ssl 证书

java - 如何获取 Json 对象并将其存储在 Hashmap 中

java - 网页中的等待图像

java - ServerSocket(port) 和多线程对于 5000 个并发客户端点击是否能正常工作?

java - 关于哈希码的问题

java - Mybatis中的foreach是硬解析还是软解析?

java - paintComponent 不工作

java - 未加载 log4j2 配置

java - jsp/servlet页面的问题