tomcat安全性约束影响缓存

时间:2014-02-17 12:47:31

标签: tomcat cache-control security-constraint

我在缓存应用程序时遇到问题。

将此代码添加到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

3 个答案:

答案 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; } }