java - 神秘的 Content-Disposition header 案例

标签 java internet-explorer tomcat flash content-disposition

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

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

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

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

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

  2. 假设 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/

相关文章:

java - 如何保存(使微调器记住)微调器下拉列表中所选项目的位置

java - 这种基于 Java 的多密码加密格式实现安全吗?

javascript - HTML 表单提交导致 IE11 中出现空白页

variables - 如何在 Web 服务器上将 Tomcat.runtime.environment.version 设置为 PROD?

apache - 如何删除 Tomcat 中的特定 cookie?

java - 是什么导致了这个 MySQLSyntaxError 异常?

java - simpleJdbcTemplate 多行获取

javascript - 简单的 javascript 在任何 IE 中都不起作用?

javascript - 单击提交按钮时重置文件上传

asp.net - IIS 7.5 基于域名的 URL 重写