1

我们的产品包括一个由 SWFObject 加载的 Flash 应用程序。对于一位客户,当通过 HTTPS(但不是 HTTP)访问此 SWF 时,Flash Player 不会加载它。

我要求客户直接转到 SWF 文件的 URL(而不是包装页):

  • 当他通过 HTTP 执行此操作时,SWF 会加载到浏览器中。
  • 当他通过 HTTPS 执行此操作时,IE7 会向他显示一个“保存文件”对话框。这意味着响应中存在“Content-Disposition:附件”标头。这也可以解释为什么 SWF 没有在 Flash Player 中加载:作为一种安全措施,它不会播放带有该标头的 SWF。

所以,我有几件事要弄清楚:

  1. 如何确定服务器正在发送 Content-Disposition 标头(而不是 IE7 的奇怪工件)?用户只能使用 IE7,不能使用 Firefox、Chrome 等。IE7 不包括 IE9 开发人员工具中提供的方便的“网络”选项卡。

  2. 假设标题存在,它是如何到达那里的?他们正在运行 Tomcat 6。SWF 由 Tomcat 的默认 servlet 提供服务。如果使用 HTTPS 连接器,则标头似乎存在,但如果使用 HTTP 连接器,则不存在。除了启用 HTTPS 连接器之外,Tomcat 配置是库存的。

在旁注中,我不相信 Flash 的缓存清除。在我的 IE9 下的机器上,即使在我明确清除浏览器缓存和 Flash Player 存储的数据后,缓存也经常满足 SWF:我在 Fiddler 或 Tomcat 的访问日志中没有看到任何请求,但 SWF 加载浏览器。我在这里错过了什么吗?客户是否正在访问某些伪造的 SWF 缓存版本?

编辑:显然开发人员工具中的“清除缓存”命令并没有真正清除缓存。使用标准方法产生了预期的结果。

编辑 2:在 Tomcat 中进行跟踪表明未设置 Content-Disposition 标头。我不确定浏览器是否没有收到它,但是AFAIK浏览器直接连接到Tomcat。这似乎是一种奇怪的浏览器端行为。

4

2 回答 2

2

该问题与响应中存在以下标头有关:

Cache-Control: no-cache
Pragma: no-cache

这些是由 Tomcat 发送的,因为该页面受到安全约束(在 conf/web.xml 中配置)的保护。这些标头导致 IE7 的行为就像存在“ Content-Disposition: attachment”标头一样。

我的解决方案是让客户在 Tomcat 的 conf/context.xml 中添加以下配置:

<Valve className="org.apache.catalina.authenticator.BasicAuthenticator" securePagesWithPragma="false" />

这将标题替换为:

Cache-Control: private

...这仍然应该实现防止代理缓存页面的目标,同时解决 IE 的问题。这是基于此处找到的解决方案:

http://daveharris.wordpress.com/2007/07/09/how-to-configure-cache-control-in-tomcat/

但是,这种非常相似的解决方案完全抑制了标题。这些属性的详细信息可以在 Tomcat 文档中找到:

http://tomcat.apache.org/tomcat-6.0-doc/config/valve.html#Basic_Authenticator_Valve/Attributes

于 2011-07-06T22:20:37.820 回答
1

您应该能够在加密之前在服务器端记录传出的 HTTP 响应,使用空密码,或将 RSA 密钥提供给 Wireshark 并查看数据包捕获的标头。

于 2011-07-01T21:15:49.733 回答