我希望为一些静态资源启用HTTP缓存,例如图像,其访问受到Spring Security的限制。 (这些资源不是安全关键,但也不应公开访问)。如何避免让Spring Security添加禁用缓存的HTTP响应头?
如果我加 setCachePeriod()
进入我的资源处理程序注册 WebMvcConfigurerAdapter.addResourceHandlers()
如下:
registry.addResourceHandler("/static/**")
.addResourceLocations("classpath:/static/").setCachePeriod(3600);
仍然返回资源以及禁用缓存的以下标头:
Cache-Control: max-age=3600, must-revalidate
Expires: Mon, 04 Aug 2014 07:45:36 GMT
Pragma: no-cache
我想避免在项目中引入任何XML配置,该项目目前仅使用Java注释配置。
有没有比扩展Spring资源处理程序更好的解决方案?
您可以使用webContentInterceptor资源来允许静态资源缓存。
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/static/*"/>
<bean id="webContentInterceptor" class="org.springframework.web.servlet.mvc.WebContentInterceptor">
<property name="cacheSeconds" value="31556926"/>
<property name="useExpiresHeader" value="true"/>
<property name="useCacheControlHeader" value="true"/>
<property name="useCacheControlNoStore" value="true"/>
</bean>
</mvc:interceptor>
</mvc:interceptors>
使用注释来配置缓存拦截器是按照以下方式完成的。
在您的Web配置类中,您可以添加一个bean WebContentInterceptor
类并将其添加到拦截器列表中。
@Bean
public WebContentInterceptor webContentInterceptor() {
WebContentInterceptor interceptor = new WebContentInterceptor();
interceptor.setCacheSeconds(31556926);
interceptor.setUseExpiresHeader(true);;
interceptor.setUseCacheControlHeader(true);
interceptor.setUseCacheControlNoStore(true);
return interceptor;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(webContentInterceptor());
}
参考 这个网站 看看它是如何完成的。
Spring 4文档有这个解决方案,“如果你真的想要缓存特定的响应,你的应用程序可以有选择地调用 HttpServletResponse.setHeader(String,String)
覆盖Spring Security设置的标头“。这有助于确保正确缓存CSS,JavaScript和图像等内容。
下面的代码片段可以用于springmvc配置,
@EnableWebMvc
public class WebMvcConfiguration extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry
.addResourceHandler("/resources/**")
.addResourceLocations("/resources/")
.setCachePeriod(31556926);
}
// ...
}
以供参考:
http://docs.spring.io/spring-security/site/docs/4.0.0.CI-SNAPSHOT/reference/htmlsingle/#headers-cache-control
您已经设置了缓存。 必重新验证 意味着一旦缓存过期(3600秒)不再使用它,所以你认为你的响应标题对你想要的是正确的。