为什么Filter会检查包含的* .js文件?

时间:2012-03-15 08:29:13

标签: jsp servlets servlet-filters

在我的Web应用程序(Apache Tomcat 7,JSP,Servlet)中,我使用了一个过滤器。在doChain方法中,我输入了以下代码:


public void doFilter(ServletRequest request, ServletResponse response, 
                    FilterChain chain) throws IOException, ServletException {

        HttpServletRequest req = (HttpServletRequest) request;
        System.out.println(req.getServletPath());

//... until doFilter
}

现在,我无法理解为什么有时候在控制台中我打印了包含在JSP(任何* .js文件)中的JavaScript文件路径。 * .css文件不会发生,只有* .js文件。更重要的是,每次访问Servlet时都不会打印* .js文件。我似乎是随机打印的。

有人对此有解释吗? 为什么会随机发生?

感谢。

编辑:实际上它也发生在* .png文件中。但考虑到这个问题的随机特性,它可能与其他文件(包括CSS)的行为相同。

NB:

  1. 我尝试根据页面路径进行身份验证,这就是我尝试这样做的原因。问题是我不想考虑* .js页面。
  2. 如果你想要一些代码,请告诉我。

  3. 已更新

    servlet中的常用代码:

    @WebServlet("/site/network") public class NetworkSettingsServlet extends HttpServlet {

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //... business logic goes here
    
        request.getRequestDispatcher("/site/network/network_view.jsp").forward(
                request, response);
        //TODO log this authentication
    }
    

    }

    和network_view.jsp代码:

        //... business logic goes here
    
        request.getRequestDispatcher("/site/network/network_view.jsp").forward(
                request, response);
        //TODO log this authentication
    }
    

    这是我代码中的模式。

2 个答案:

答案 0 :(得分:1)

如果没有调用,则只需从浏览器缓存加载相关资源。这是一件好事,因为它可以节省网络带宽和服务器负载,从而提高双方的性能。

如果确实坚持必须在每个请求上从服务器下载所有这些资源,那么您需要扩展过滤器以添加响应标头,指示浏览器不< / em>缓存这些回复。

HttpSerlvetResponse res = (HttpServletResponse) response;
res.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
res.setHeader("Pragma", "no-cache"); // HTTP 1.0.
res.setDateHeader("Expires", 0); // Proxies.

在测试之前不要忘记清除浏览器缓存。

答案 1 :(得分:-2)

我知道两个解决方案:

  1. 您可以为js文件添加“默认”servlet。
  2. 因此,web.xml看起来像这样:

    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.js</url-pattern>
    </servlet-mapping>
    

    2您必须在过滤器类中添加shouldExclude()方法。 如果您不想传递* .js文件,这是一个示例:

    public void doFilter(ServletRequest request, ServletResponse response, 
                    FilterChain chain) throws IOException, ServletException {
    
        if(shouldExclude(req)) {
              chain.doFilter(req, res);
    
        }
    }
    
    
    
    private boolean shouldExclude(ServletRequest req) {
         if(req instanceof HttpServletRequest) {
             HttpServletRequest hreq = (HttpServletRequest) req;
             return (hreq.getRequestURI().endsWith(".js"));
         }
         return false;
    }