【问题标题】:Add an Expires or a Cache-Control header in JSP在 JSP 中添加 Expires 或 Cache-Control 标头
【发布时间】:2011-03-04 13:44:35
【问题描述】:

如何在 JSP 中添加 Expires 或 Cache-Control 标头?我想在包含页面中为我的静态组件(例如图像、CSS 和 JavaScript 文件)添加一个遥远的到期日期。

【问题讨论】:

    标签: java jsp http cache-control


    【解决方案1】:
    <%
        response.setHeader("Cache-Control", "no-cache");
        response.setDateHeader("Expires", 0);
    %>
    

    【讨论】:

    • OP 说他想要一个在遥远的将来过期的页面,但这个答案却给了他相反的结果。
    【解决方案2】:

    要禁用 JSP 页面的浏览器缓存,请创建一个映射到 *.jsp 的 url-pattern 的 Filter,并在 doFilter() 方法中基本上执行以下操作:

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

    这样您就不需要将它复制粘贴到所有 JSP 页面上并用 scriptlet 将它们弄得一团糟。

    要为 CSS 和 JS 等静态组件启用浏览器缓存,请将它们全部放在一个公共文件夹中,例如 /static 或 /resources,并创建一个映射到 url-pattern 或 /static/* 或 @ 的 Filter 987654334@ 并在doFilter() 方法中基本上执行以下操作:

    httpResponse.setDateHeader("Expires", System.currentTimeMillis() + 604800000L); // 1 week in future.
    

    另见:

    【讨论】:

    • 感谢它对我的帮助很大。但是第二行不是有错误吗?恕我直言,应该是:httpResponse.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
    • 我从一本书中找到了这篇文章:onjava.com/pub/a/onjava/excerpt/jebp_3/index2.html,他们为 IE 设置了一些额外的标题,// Set IE extended HTTP/1.1 no-cache headers (use addHeader). res.addHeader("Cache-Control", "post-check=0, pre-check=0");
    • @Christophe:这是一个神话。这仅适用于可缓存资源。您不需要在已经不可缓存的资源上使用它。当一个页面被无意地用作可缓存的页面,然后开发人员通过使其不可缓存来修复它时,您经常会看到这个额外的标题。但是,如果没有这 2 个指令,它仍然会留在 IE 中,直到最终用户自己明确清除 IE 缓存。
    • 当我这样做时,屏幕上什么也没有。我有两个过滤器 1> myApp 这个 url 模式为 /* 2> CacheManagerFilter对于这个作为 *.jsp 的 url 模式,这可能是问题所在吗?我该如何处理这种情况?
    • 显然你忘了继续过滤链。
    【解决方案3】:

    像 Tomcat 这样的 Servlet 容器带有一组预定义的过滤器。参见例如Expires Filter。使用现有的过滤器可能比创建自己的类似过滤器更容易。

    【讨论】:

      【解决方案4】:
      <%
          response.setHeader("Cache-Control", "no-cache"); //HTTP 1.1
          response.setHeader("Pragma", "no-cache"); //HTTP 1.0
          response.setDateHeader("Expires", 0); //prevents caching at the proxy server
      %>
      

      【讨论】:

      • 应该同时使用“Cache-Control”和“Pragma”还是只使用一个取决于 servlet Container?
      • OP 说他想要一个在遥远的将来到期的页面,但这个答案却给了他相反的结果。
      猜你喜欢
      • 2011-05-29
      • 1970-01-01
      • 1970-01-01
      • 2011-08-13
      • 2011-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-24
      相关资源
      最近更新 更多