【问题标题】:Filter called sveral times by Tomcat containerTomcat容器多次调用过滤器
【发布时间】:2011-11-06 17:58:05
【问题描述】:

我希望在理解 java 过滤器的特定行为方面有所帮助:我编写了一个简单的过滤器,它获取所有用户请求,如果未登录的用户需要受限资源,过滤器会将用户转发到主页。这是我的代码:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    // TODO Auto-generated method stub
    // place your code here

    HttpServletRequest req = (HttpServletRequest) request;
    String uri = req.getRequestURI();

    System.out.println("\n\nFILTERING...\n\n");

    //Se la risorsa appartiene all'area ristretta e l'utente non è
    //loggato lo sbatto fuori
    if(uri.contains("restricted") && (req.getSession(false) == null || req.getSession(false).getAttribute("user") == null)) {

        System.out.println("\n\nCannot access\n\n");
        //((HttpServletResponse) response).sendRedirect("/Hotel/index.jsp");
        req.getRequestDispatcher("/index.jsp").forward(request, response);
    }
    else {
        // pass the request along the filter chain
        System.out.println("\n\nNext step\n\n");
        chain.doFilter(request, response);
    }
}

以及web.xml中的映射:

<filter>
<filter-name>MyFilter</filter-name>
<filter-class>mycontroller.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> 

让我感到奇怪的是,如果我通过 URL 询问受限资源,doFilter 方法会在移动到家之前被调用多次(服务器记录 'FILTERING... 无法访问' 4,5 次) . 我正在使用Tomcat 7。 有人可以帮我理解吗?非常感谢

【问题讨论】:

标签: java servlets servlet-filters


【解决方案1】:

您已将过滤器映射到/*。因此,它将拦截每个单个 HTTP 请求。不仅是 HTML/JSP 页面,还有 CSS、JS 和图像文件等静态资源。显然,您请求了一个 HTML/JSP 页面,该页面又引用了几个 CSS、JS 和/或图像文件。

您在过滤器中的检查也很差。您应该将过滤器映射到/restricted/*

<url-pattern>/restricted/*</url-pattern>

然后从过滤器的代码中删除该 URI 检查。如果您将这些静态资源放在该地图之外,例如在/static/resources 等中,则不会为它们调用过滤器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    • 2015-08-23
    • 2014-08-14
    • 2015-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多