2016-03-15 52 views
1

的Spring Security默認情況下增加了以下緩存頭:如何刪除過期使用Spring高速緩存控制頭

Cache-Control: no-cache, no-store, max-age=0, must-revalidate 
Pragma: no-cache 
Expires: 0 

這對我們的HTML頁面的好環境。對於靜態資源(圖片,CSS等),我們希望將它們緩存起來。按照Spring documentation,它可以像這樣被配置:

@EnableWebMvc 
public class WebMvcConfiguration extends WebMvcConfigurerAdapter { 

    @Override 
    public void addResourceHandlers(ResourceHandlerRegistry registry) { 
     registry 
      .addResourceHandler("/resources/**") 
      .addResourceLocations("/resources/") 
      .setCachePeriod(31556926); 
    } 
} 

導致下面的HTTP標頭:

Cache-Control: max-age=604800 
Pragma: 
Expires: 0 

這是除了Expires頭,它仍然表明該文件不應該是好的緩存。 (該標準指出,max-age優先Expires。但是,我們的中間緩存仍然將其視爲非緩存)。

如何才能去掉Expires頭(或將其設置爲空)的緩存文件?如果我們配置緩存期,爲什麼Spring不刪除它?

+0

你使用的是什麼版本的spring-web?如果你使用的是spring-web-4.2.5.RELEASE.jar,你可能會遇到https://jira.spring.io/browse/SPR-14005你可以看到,如果spring-web- 4.2.4.RELEASE.jar –

+0

我們仍然在4.2.4。所以它與SPR-14005無關。但是,在其中一個bug的評論中,有一個如何從Spring Security中排除某些資源的示例。這對我們來說是一個可行的解決方案你想添加是作爲一個答案?無論如何感謝鏈接。 – Codo

+0

感謝您的回覆和反饋。請不要在該JIRA上使用解決方法。有關詳細信息,請參閱以下答案 –

回答

0

設置ResourceHttpRequestHandler.useExpriresHeaderfalse

不幸的是配置對象ResourceHandlerRegistry中沒有這樣的標誌。所以,你需要做你自己:

以下只是一個想法,我沒有檢查,這種方法不配置任何其他HandlerMappingResourceHttpRequestHandler

@Override 
@Bean 
public HandlerMapping resourceHandlerMapping() { 
    ResourceHandlerRegistry registry = new ResourceHandlerRegistry(this.applicationContext, this.servletContext); 
    addResourceHandlers(registry); 

    AbstractHandlerMapping handlerMapping = registry.getHandlerMapping(); 
    if (handlerMapping != null) { 
     handlerMapping.setPathMatcher(mvcPathMatcher()); 
     handlerMapping.setUrlPathHelper(mvcUrlPathHelper()); 
     handlerMapping.setInterceptors(new HandlerInterceptor[] { 
       new ResourceUrlProviderExposingInterceptor(mvcResourceUrlProvider())}); 

     //this line!!!: 
     ((ResourceHttpRequestHandler)handlerMapping).setUseExpiresHeader(false); 
    } 
    else { 
     handlerMapping = new EmptyHandlerMapping(); 
    } 
    return handlerMapping; 
} 
+0

恐怕它默認爲* false *。此外,useExpiresHeader已棄用。所以這段代碼不會改變任何東西。我的調試還顯示,Spring Security在請求處理的早期會插入* Expires *標頭。所以'ResourceHttpRequestHandler'需要主動解除它。將它設置爲* true *可能更有意義...... – Codo

1

這似乎是與spring-security#3759有關。您可以通過忽略(有點不相關)SPR-14005上列出的特定URL來解決此問題。但是,這並不建議(即使URL指向靜態資源),因爲這意味着URL的所有安全性都被禁用。

相反,用戶應該考慮使用此解決方法:

@EnableWebSecurity 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     RequestMatcher notResourcesMatcher = new NegatedRequestMatcher(new AntPathRequestMatcher("/resources/**")); 
     HeaderWriter notResourcesHeaderWriter = new DelegatingRequestMatcherHeaderWriter(notResourcesMatcher , new CacheControlHeadersWriter()); 
     http 
      .headers() 
       .cacheControl().disable() 
       .addHeaderWriter(notResourcesHeaderWriter); 
    } 
} 

當春季安全4.1發佈spring-security#3759將是固定的,這不應該是一個問題。