Skip to main content
 首页 » 编程设计

spring-mvc之Spring MVC 禁用资源 .js 文件的缓存

2025年02月15日18dflying

我们在一个 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 错误。

这种事情可能吗?

请您参考如下方法:

我意识到这个答案来得太晚了,但这里是供将来引用。

使用 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有关更多信息。