0

我正在开发一个使用 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 中导致难看的重新发布警告,并且我们认为 CONFIDENTIAL 传输保证还包括所有适当的机制来防止浏览器缓存页面。我们宁愿把问题留给 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 不同)仍然是个谜……

保罗。

4

1 回答 1

1

没有浏览器应该缓存它通过 SSL 接收到的任何项目,所以我倾向于 IE6 中的错误。您可以尝试将 0 或 -1 作为 Expires 的值而不是 1,但您所做的其他一切对我来说看起来都不错。

response.setHeader("Expires", 0);
于 2009-07-16T15:25:54.987 回答