11

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

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

3 回答 3

5

根据 Oracle Java EE 6 教程,将使用指定user-data-constraint“机密”

当应用程序要求传输数据以防止其他实体观察传输的内容时。

对于 HTTP 响应,这意味着确保从服务器返回客户端的过程中没有代理/缓存能够缓存该响应并提供给任何其他请求客户端。因此使用:

Cache-Control: private

虽然您可能想使用“INTEGRAL”而不是“CONFIDENTIAL”,但同一教程指出许多 Java EE 服务器对这两个值的处理方式相同。

如果您的应用程序需要允许缓存,我怀疑您需要从文件中删除该<user-data-constraint>元素。web.xml

希望这可以帮助!

于 2016-03-16T06:50:50.963 回答
1

所以我想知道我应该如何配置 tomcat 应用程序以具有自动 SSL 重定向,但保留静态资源的缓存?我的意思是应用程序完全通过 SSL,以及应该缓存的静态资源。

似乎在设置之后<url-pattern>/*</url-pattern>甚至<url-pattern>/</url-pattern>我无法使用 transport-guarantee 声明不同的 url-pattern NONECache-Control: private无论如何,一切都是从我的根 URL 开始的。

但我找到了解决方案,至少在 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作为第二个过滤器,在这里你可以配置你自己的缓存设置。

于 2016-07-06T13:23:54.120 回答
0

因为我发现在这里发布另一个答案response.reset()有点太多了,因为它基本上会擦除响应和所有其他可能已设置的标头。

只需扩展isEligibleToExpirationHeaderGeneration并返回true

碰巧的是,之前由 ROOT web.xml 设置的过期标头尚未提交,因此需要覆盖 catalina 的过期过滤器中的某些行为。你可以使用你的MyExpiresFilter完全一样,ExpiresFilter因为它扩展了它。
public class MyExpiresFilter extends org.apache.catalina.filters.ExpiresFilter { @Override protected boolean isEligibleToExpirationHeaderGeneration( HttpServletRequest request, XHttpServletResponse response) { return true; } }

于 2018-09-21T18:02:21.380 回答