我们在一个 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 post和 this example app有关更多信息。