2014-02-17 112 views
8

我在緩存我的應用程序時遇到問題。tomcat安全約束影響緩存

當該代碼添加到tomcat的web.xml中:

<security-constraint> 
    <web-resource-collection> 
     <web-resource-name>HTTPSOnly</web-resource-name> 
     <url-pattern>/*</url-pattern> 
    </web-resource-collection> 
    <user-data-constraint> 
     <transport-guarantee>CONFIDENTIAL</transport-guarantee> 
    </user-data-constraint> 
</security-constraint> 

我得到這樣的迴應:


Cache-Control private 
Date Tue, 18 Feb 2014 01:18:17 GMT 
Etag W/"200-1391558564593" 
Expires Thu, 01 Jan 1970 00:00:00 WET 
Server Apache-Coyote/1.1 

沒有這個代碼一切都很好:

Accept-Ranges bytes 
Cache-Control max-age=604800 
Content-Length 1496 
Content-Type text/css 
Date Tue, 18 Feb 2014 01:21:26 GMT 
Etag W/"1496-1391558561359" 
Expires Tue, 25 Feb 2014 01:21:27 GMT 
Last-Modified Wed, 05 Feb 2014 00:02:41 GMT 
Server Apache-Coyote/1.1 

任何人都可以知道是什麼原因造成的問題?以及爲什麼此代碼將緩存控制更改爲我的應用程序的私有內容。非常感謝

Tomcat 7.0 
JDK : 1.6 

回答

4

根據甲骨文Java EE 6 tutorial,指定的「保密」一user-data-constraint是用來

當應用程序需要的數據被髮送,以便防止其它實體觀察的傳輸的內容。

對於HTTP響應,這意味着確保從服務器返回到客戶端的沿途沒有代理/緩存將能夠緩存該響應並提供給任何其他請求客戶端。因此,使用的:

Cache-Control: private 

雖然你可能會用「積分」,而不是「機密」,同樣的教程指出,許多Java EE服務器相同的對待這兩個值。

如果您的應用程序需要緩存,我懷疑您需要從web.xml文件中刪除<user-data-constraint>元素。

希望這會有所幫助!

1

所以我想知道我應該如何配置tomcat應用程序自動SSL重定向,但保留了靜態資源緩存?我的意思是應用程序完全通過SSL,以及應該被緩存的靜態資源。

看來,設置<url-pattern>/*</url-pattern>甚至<url-pattern>/</url-pattern>後,我不能聲明不同的網址模式與傳輸保證NONE。無論如何,從我的根URL開始的所有東西現在都有Cache-Control: private

但我找到了解決方案,至少在Tomcat 7.0.55中工作。這些頭文件在處理整個請求之前幸運地設置,因此您可以在第一個應用程序過濾器上捕獲它們。當你將在這裏重置響應,你可以設置自己的頭並覆蓋現有:

@Override 
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
    response.reset(); 
    chain.doFilter(request, response); 
} 

然後你就可以例如Tomcat的配置ExpiresFilter作爲第二過濾器,在這裏你可以配置你自己的緩存設置。