在我的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:
已更新
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
}
这是我代码中的模式。
答案 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)
我知道两个解决方案:
因此,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;
}