Spring MVC禁用资源.js文件的缓存

时间:2012-09-21 09:06:35

标签: spring-mvc

我们在Web应用程序中有一堆.js文件,它们不在一个目录下。 UI是单独开发的,重新设计它以将所有* .js文件放在一个地方非常耗时。

问题是浏览器缓存了这些文件,这会给每次应用程序更新带来很多问题。我们决定关闭这些文件的缓存。

因此,* .js文件包含在servlet映射中:

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

我尝试过使用mvc:resources,但它不会像这样处理url的掩码:

<mvc:resources mapping="*.js" location="*.js" cache-period="0"/>

当我尝试访问js文件时,这不起作用,我有404响应。

我也试过mvc:interceptor:

    <mvc:interceptor>
        <mvc:mapping path="*.js"/>
        <bean id="webJSContentInterceptor"
              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>

这也会导致404错误。

这类事可能吗?

3 个答案:

答案 0 :(得分:6)

我意识到这个答案来得相当晚,但这是为了将来参考。

使用ResourceHttpRequestHandlers(Spring 3.2 +)

提供静态资源

首先,您使用<mvc:resources>走在正确的轨道上,您的路径模式声明中只有一个拼写错误:

  • location必须是资源所在的文件夹位置(可以在您的文件系统,您的webapp资源,类路径,webJAR中...)
  • 模式必须考虑您的项目布局

让我们说你有以下结构:

src/main/webapp/static/
  |- js/
  |- js/lib/jquery.js
  |- js/main.js
  |- css/style.css

您可以像这样提供所有静态资源:

<mvc:resources mapping="/**" location="/static/"/>

注意:cache-period和其他属性应该可以正常工作。

资源处理功能(Spring 4.1 +)

从Spring 4.1开始,有一些新的,更灵活的方法可以解决这个问题。

例如,您可以使用这样的JS和CSS文件实现缓存清除:

<mvc:resources mapping="/**" location="/static/"/>
  <mvc:resource-chain resource-cache="true">
    <mvc:resolvers>
      <mvc:version-resolver>
        <mvc:content-version-strategy patterns="/**"/>
      </mvc:version-resolver>
    </mvc:resolvers>
  </mvc:resource-chain>
</mvc:resources>

当然,您可以使用javaconfig实现相同的功能(更优雅):

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {

  VersionResourceResolver versionResolver = new VersionResourceResolver()
    .addContentVersionStrategy("/**");

  registry.addResourceHandler("/**")
    .addResourceLocations(/static/)
    .resourceChain(true).addResolver(versionResolver);
}

有关详情,请参阅此blog postthis example app

答案 1 :(得分:2)

这是不可能的。但有几种选择:

  • 实现自定义过滤器,将其映射到* .js掩码并从那里设置所需的标题。
  • 处理JavaScript中的缓存清除。我们这样做了,并在我们的JS文件路径中添加了一个版本号。

答案 2 :(得分:0)

据我说,问题是你的JS文件没有被加载。 在第二种方法中,您尝试过没有正确指定路径属性的值。映射是正确的,但代替了您需要指定JS文件所在根目录的确切位置的路径。

尝试这样做。希望这会对你有所帮助。