【发布时间】:2009-07-16 15:23:20
【问题描述】:
我正在开发一个使用 Tomcat 6.0.10 的 Java/Struts 应用程序。它是一个典型的 Web 应用程序,允许用户编辑某些表单并流式传输 PDF。回过头来,我们补充说:
<security-constraint>
<web-resource-collection>
<web-resource-name>GeneralRequests</web-resource-name>
<url-pattern>/WR1/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
这样任何非流媒体页面都被强制进入 https 并且不被缓存(我们认为)。系统中的流页面有单独的约束入口。
在最近对 IE6 的测试中,我们发现“有时”页面正在缓存,尽管我们还没有完全确定什么时候。除了 CONFIDENTIAL 标志外,我们还曾经有:
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache,no-store,max-age=0");
response.setDateHeader("Expires", 1);
但我们删除了这些,因为它似乎会在 IE6 中导致难看的重新发布警告,并且我们认为机密传输保证还包括所有适当的机制,以防止浏览器缓存页面。我们宁愿把问题留给 Tomcat 来处理。
什么是做这些事情的“正确”方法,这样我们将来就不会遇到(那么多)问题?
我们的缓存问题是由 IE6 中的特定错误引起的吗?还是只是一组特定的版本?这是否允许在 7 和/或 8 中发生?
更新:我们检查了,Tomcat 正确地发送了 Pragma、Cache-Control 和 Expires 参数,所以这不是问题(好吧,no-string 和 max-age 值不是正在发送,但仍然不是问题)。
问题出在 Apache Portable Runtime (APR) 1.1.8 上。不知何故,虽然我们不完全确定原因,但它正在从单个请求创建重复的浏览器操作。对我们来说,看起来好像页面被缓存了,因为它包含一个无效的 Struts 事务令牌,但实际上同一请求的第二个执行版本(具有错误的会话 id)正在覆盖会话中原始请求的令牌。升级到 1.1.16 解决了这个问题。
为什么有些请求会重复(但会话 ID 不同)仍然是个谜...
保罗。
【问题讨论】:
标签: java tomcat no-cache confidential