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

afa*_*sky 5 spring-mvc

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

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

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

<servlet-mapping>
    <servlet-name>app</servlet-name>
    <url-pattern>*.js</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)

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

<mvc:resources mapping="*.js" location="*.js" cache-period="0"/>
Run Code Online (Sandbox Code Playgroud)

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

我也试过mvc:拦截器:

    <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>
Run Code Online (Sandbox Code Playgroud)

这也导致404错误.

这类事可能吗?

Bri*_*zel 6

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

使用ResourceHttpRequestHandlers提供静态资源(Spring 3.2+)

首先,你走在正确的轨道上<mvc:resources>,你的路径模式声明只有一个错字:

  • location一定情况下,您的资源生活的一个文件夹位置(这可能是你的文件系统上,在你的web应用资源,在类路径中,在webJARs ...)
  • 模式必须考虑您的项目布局

假设你有以下结构:

src/main/webapp/static/
  |- js/
  |- js/lib/jquery.js
  |- js/main.js
  |- css/style.css
Run Code Online (Sandbox Code Playgroud)

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

<mvc:resources mapping="/**" location="/static/"/>
Run Code Online (Sandbox Code Playgroud)

注意: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>
Run Code Online (Sandbox Code Playgroud)

当然你可以用javaconfig实现同样的东西(更优雅):

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {

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

  registry.addResourceHandler("/**")
    .addResourceLocations(/static/)
    .resourceChain(true).addResolver(versionResolver);
}
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅此博客文章此示例应用.


afa*_*sky 2

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

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