我在缓存应用程序时遇到问题。
将此代码添加到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
任何人都可以说出问题的原因是什么?以及为什么这段代码将cache-controle更改为我的应用程序的私有。非常感谢
Tomcat 7.0
JDK : 1.6
答案 0 :(得分:4)
根据Oracle Java EE 6 tutorial,指定user-data-constraint
&#34; CONFIDENTIAL&#34;将被使用
当应用程序要求传输数据时,以防止其他实体观察传输内容。
对于HTTP响应,这意味着确保从服务器返回到客户端的任何代理/缓存都不能缓存该响应并提供给任何其他请求客户端。因此使用:
Cache-Control: private
虽然你可能想要使用&#34; INTEGRAL&#34;而不是&#34; CONFIDENTIAL&#34;,同一个教程指出许多Java EE服务器对这两个值的处理方式相同。
如果您的应用需要允许缓存,我怀疑您需要从<user-data-constraint>
文件中删除web.xml
元素。
希望这有帮助!
答案 1 :(得分:1)
所以我想知道如何配置tomcat应用程序以实现自动SSL重定向,但是保留了静态资源的缓存?我的意思是应用程序完全通过SSL,以及应该缓存的静态资源。
似乎在设置<url-pattern>/*</url-pattern>
或甚至<url-pattern>/</url-pattern>
后,我无法使用transport-guarantee NONE
声明不同的url-pattern。无论如何,从我的根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作为第二个过滤器,在这里您可以配置自己的缓存设置。
答案 2 :(得分:0)
自从我发现response.reset()
以来,在这里发布另一个答案有点太多,因为它实质上抹掉了响应以及可能已设置的所有其他标头。
只需扩展isEligibleToExpirationHeaderGeneration
并返回true
。
由于恰好发生了,尚未提交由ROOT web.xml设置的先前的expires头,因此这是从catalina的Expires Filter覆盖某些行为的问题。您可以像MyExpiresFilter
一样使用ExpiresFilter
,因为它可以扩展它。
public class MyExpiresFilter extends org.apache.catalina.filters.ExpiresFilter {
@Override
protected boolean isEligibleToExpirationHeaderGeneration(
HttpServletRequest request,
XHttpServletResponse response) {
return true;
}
}