Java Tomcat容器多次调用过滤器

Java Tomcat容器多次调用过滤器,java,servlets,servlet-filters,Java,Servlets,Servlet Filters,在理解java过滤器的特定行为方面,我希望得到一些帮助:我编写了一个简单的过滤器,它可以获取所有用户请求,如果未登录的用户需要受限的资源,过滤器会将用户转发到主页。这是我的密码: public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // TODO Auto-generated meth

在理解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中的映射:


我的过滤器
mycontroller.MyFilter
我的过滤器
/*
让我感到奇怪的是,如果我通过URL请求受限资源,doFilter方法在移动到主服务器之前会被调用数次(服务器记录“筛选…无法访问”4,5次)。 我正在使用Tomcat7。
有人能帮我理解吗?非常感谢

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

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

/restricted/*

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

Uriah Carpenter回答了一个与此问题非常类似的问题:->客户端对页面上的每个组件发出不同的请求。无论如何谢谢你