我们的产品包括一个由 SWFObject 加载的 Flash 应用程序。对于一位客户,当通过 HTTPS(而非 HTTP)访问此 SWF 时,Flash Player 将不会加载它。
我要求客户直接转到 SWF 文件的 URL(而不是包装页面):
- 当他通过 HTTP 执行此操作时,SWF 会加载到浏览器中。
- 当他通过 HTTPS 这样做时,IE7 会向他显示一个“保存文件”对话框。这意味着响应中存在“Content-Disposition: attachment” header 。这也可以解释为什么 SWF 没有加载到 Flash Player 中:作为一项安全措施,它不会播放使用该 header 提供的 SWF。
所以,我有几件事想弄清楚:
我如何确定服务器正在发送 Content-Disposition header (而不是 IE7 的奇怪产物)?用户只能使用 IE7,不能使用 Firefox、Chrome 等。IE7 不包含 IE9 开发人员工具中提供的方便的“网络”选项卡。
假设 header 存在,它是如何到达那里的?他们正在运行 Tomcat 6。SWF 由 Tomcat 的默认 servlet 提供服务。如果使用 HTTPS 连接器, header 似乎存在,但如果使用 HTTP 连接器,则不存在。除了启用 HTTPS 连接器外,Tomcat 配置是常用的。
附带说明一下,我不相信 Flash 的缓存清除功能。在我的 IE9 下的机器上,即使我明确清除了浏览器缓存和 Flash Player 的存储数据,SWF 也经常被缓存满足:我在 Fiddler 或 Tomcat 的访问日志中没有看到任何对它的请求,但是 SWF 加载浏览器。我在这里错过了什么吗?客户是否正在访问某些伪造的 SWF 缓存版本?
编辑:显然,开发人员工具中的“清除缓存”命令不会真正清除缓存。使用标准方法产生了预期的结果。
编辑 2:Tomcat 中的跟踪表明未设置 Content-Disposition header 。我不确定浏览器是否没有接收到它,但 AFAIK 浏览器直接连接到 Tomcat。这似乎是一种奇怪的浏览器端行为。
最佳答案
问题与响应中存在以下 header 有关:
Cache-Control: no-cache
Pragma: no-cache
这些是由 Tomcat 发送的,因为该页面受到安全约束(在 conf/web.xml 中配置)的保护。这些 header 导致 IE7 的行为就像存在“Content-Disposition: attachment
” header 一样。
我的解决方案是让客户将以下配置添加到 Tomcat 的 conf/context.xml 中:
<Valve className="org.apache.catalina.authenticator.BasicAuthenticator" securePagesWithPragma="false" />
这会将 header 替换为:
Cache-Control: private
...这仍然可以实现防止代理缓存页面的目标,同时解决 IE 的问题。这是基于此处找到的解决方案:
http://daveharris.wordpress.com/2007/07/09/how-to-configure-cache-control-in-tomcat/
但是,这个非常相似的解决方案完全抑制了 header 。这些属性的详细信息可以在此处的 Tomcat 文档中找到:
http://tomcat.apache.org/tomcat-6.0-doc/config/valve.html#Basic_Authenticator_Valve/Attributes
关于java - 神秘的 Content-Disposition header 案例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6553162/