过滤器被Tomcat容器调用了几次

Nic*_*lla 2 java servlets servlet-filters

我想帮助理解java Filters的特定行为:我编写了一个简单的Filter来获取所有用户请求,如果未记录的用户需要受限资源,则过滤器会将用户转发到主页.这是我的代码:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

和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> 
Run Code Online (Sandbox Code Playgroud)

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

Bal*_*usC 6

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

您在过滤器中的检查也很差.您应该更好地映射过滤器/restricted/*.

<url-pattern>/restricted/*</url-pattern>
Run Code Online (Sandbox Code Playgroud)

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