实现URL过滤器

时间:2014-03-27 14:38:54

标签: java tomcat servlets embedded-tomcat-7 tomcat8

嵌入式Tomcat的简单实例,其中包含 Servlet 过滤器

            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");

网址过滤实施:

@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过滤器的正确方法是什么,以便我可以在传递响应之前仔细检查请求周围的参数?

2 个答案:

答案 0 :(得分:1)

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

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

filterChain.dofilter(request, response);

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

我不清楚过滤器正在尝试过滤的内容。如果您打算按URL过滤,那么您应该查找匹配的网址,然后仅在匹配时重定向。

答案 1 :(得分:0)

由于这解决了您的问题,请将其作为答案发布。

首先,您需要确保 要么在应用程序过滤器链中传递请求,要么重定向它:

@Override
public void doFilter(ServletRequest request, ServletResponse response,
    FilterChain filterChain) throws IOException, ServletException {

    Boolean filtered = false;
    System.out.println("request intercepted");
    if (!filtered) {
        filtered = true;
        ((HttpServletResponse) response).sendRedirect("/Servlet1");
        return;
    }

    filterChain.doFilter(request, response);
}

然后,您需要确保过滤器知道传入请求何时已被重定向,以便它不会再次重定向:

@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 = (Boolean) request.getAttribute("filtered");
    }

    if (!filtered) {
        request.setAttribute("filtered", Boolean.TRUE);
        ((HttpServletResponse) response).sendRedirect("/Servlet1");
        return;
    }

    filterChain.doFilter(request, response);
}