【问题标题】:Caching in Tomcat and Spring MVCTomcat 和 Spring MVC 中的缓存
【发布时间】:2016-10-30 13:34:29
【问题描述】:

我有一个 web 应用程序,它作为 war 文件部署到 Tomcat 容器中。应用程序本身有两个主要方面:

  1. 它使用 Spring MVC 提供 REST 端点
  2. 它将基于 AngularJS 的单页应用程序作为静态内容提供。从技术上讲,根 webapp 文件夹中有一个 index.html,它使用 html http-equiv="refresh" 重定向重定向到子文件夹中的实际 index.html。

当我更新应用程序时,我经常注意到浏览器不会从服务器加载最新版本,而只会显示一些较旧的缓存版本。例如网站在登录页面显示当前版本号,所以如果我将它从1.0.5更新到1.0.6,我经常发现即使我重新加载页面浏览器仍然显示1.0.5。按CTRL+F5 忽略缓存通常可以暂时解决此问题。

我对整个缓存主题不是很熟悉,所以我正在寻找资源以开始。

问题:

  • 缓存问题是我必须在 Spring 中配置的吗?
  • 当我部署 war 文件时,它是不是必须在 Tomcat 中配置?
  • 会不会是上面提到的html重定向引起的问题?

【问题讨论】:

  • 请澄清您的具体问题或添加其他详细信息以准确突出您的需要。正如目前所写的那样,很难准确地说出你在问什么。请参阅“如何提问”页面以获得澄清此问题的帮助。
  • "一些旧内容" ?什么旧内容,jsps,js文件,图像,属性文件,java代码?你到底更新了什么?我猜,如果您在 tomcat 服务器运行时更​​新应用程序内容,您的应用程序不会更新,或者如果您在 tomcat 关闭时更新应用程序,您会看到旧内容吗?
  • 我已经对这个问题进行了一些更新,如果我能更好地了解导致这种行为的原因,我可能能够提供更准确的信息。

标签: java spring tomcat caching


【解决方案1】:

按 CTRL+F5 忽略缓存通常可以暂时解决此问题。

我相信这意味着整个事情都在browser caching/HTTP caching

解决方案 1。

Disable cache in Google Chrome 通过设置(或为您的浏览器查找类似文章)。

解决方案 2。

浏览器缓存实际上由Cache-Control 标头控制。

如果您告诉浏览器不要缓存动态内容,则可以避免这种情况。为此,您必须编写一些缓存控制标头。

嗯,在 Java Spring Framework 中,有一种非常简单的方法可以停止动态内容缓存。在您的 servlet 上下文中,只需声明一个 bean WebContentInterceptor 并定义它的属性。

<mvc:interceptors>
    <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" p:paramName="lang"/>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <mvc:exclude-mapping path="/resources/**"/>
        <bean id="webContentInterceptor" class="org.springframework.web.servlet.mvc.WebContentInterceptor">
            <property name="cacheSeconds" value="0"/>
            <property name="useExpiresHeader" value="true"/>
            <property name="useCacheControlHeader" value="true"/>
            <property name="useCacheControlNoStore" value="true"/>
        </bean>
    </mvc:interceptor>
</mvc:interceptors>

【讨论】:

  • 解决方案 1 不适用,因为这只会为我解决问题,但不适用于其他技术含量较低的用户。我将尝试解决方案 2。 Tomcat对缓存有影响吗?
  • 另一个问题,拦截器是否只适用于其余端点或也适用于静态提供的内容?
  • @lanoxx Tomcat 服务器有自己的缓存。您可以清除和disable it。 IDK 如果拦截器适用于静态提供的内容。自己试试吧。
【解决方案2】:

这些标签应该有助于防止从缓存中读取

<meta http-equiv="Pragma" content="no-cache">
 <meta http-equiv="Cache-Control" content="no-cache">
 <meta http-equiv="Expires" content="Sat, 01 Dec 2001 00:00:00 GMT">

Cache-Control 标头是在 HTTP 1.1 中添加的,而另外两个标头也存在于 HTTP 1.0 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-04
    • 1970-01-01
    • 2017-01-01
    • 2020-09-01
    • 2017-01-13
    • 1970-01-01
    • 2012-03-09
    • 2013-06-03
    相关资源
    最近更新 更多