首先,缓存在所有浏览器中都不起作用。然后我通过在url中添加.pdf扩展名使其在所有浏览器中工作但IE(IE8)。之后Servlet停止被调用。

我通过加载以下网址的EMBED标记在网页上内嵌显示pdf文件:

http://localhost:7001/app/viewFile.pdf

这是由java servlet生成的,包含以下标题:

response.addHeader("Content-Disposition", "inline;");
response.setHeader("Cache-control", "cache,max-age=600");
response.setContentType(mimeType);
response.setContentLength(contentLength);

对于在所有浏览器中显示的pdf,我使用的是Adobe Reader 9.2.0。

如何让它在IE中运行?我注意到IE将“Cache-Control:no-cache”标题添加到请求,而Safari则没有。

有帮助吗?

解决方案

如前所述, 缓存控制 标头值 cache 无效。改为使用 public

对于IE未遵守 embed object 元素中的服务器端缓存控制规则,遗憾的是这是一个“特征”。 IE浏览器最好的办法是用 iframe 元素替换它。

其他标题如 expires last-modified etag 等等都无济于事。

其他提示

要考虑的一些想法:

  1. 我认为 cache 不是有效的 Cache-Control 指令。

    尝试使用 public 的值,或者 private ,如果这更适合您的内容。有关详细信息,请查看 RFC 2616

  2. 也许你发送了不止一个 Cache-Control 指令?

    使用工具 比如 Firebug LiveHTTPHeaders 以查看 您的浏览器的实际标头 接收。确保它们不是 得到你不期望的东西。 听起来你可能已经是 虽然这样做。另外请确保您还没有发送 Pragma:no-cache

  3. 尝试设置 除了使用之外, Expires 标头 <代码>缓存控制

    这也是可能的 你正在发送浏览器 冲突的 Cache-Control / Pragma 标题和IE选择采取 无论出于何种原因, Pragma 标头都是第一优先。

  4. 确保IE配置为允许缓存! :)

    控制面板&gt; Internet Options &gt; 临时互联网文件&gt; 设置&gt; 检查存储页面的较新版本

  5. 尝试发送PDF作为对 POST 请求的回复(通过表单提交)。

    由于 RFC 2616 :“默认情况下,如果请求方法,请求标头字段,响应状态的要求表明它是可缓存的,则响应是可缓存的。 &QUOT;对 POST 请求的响应不可缓存,因此IE不应在其请求中包含该标头。

  6. 尝试使用一致的值发送 Content-MD5 Last-Modified 标头(如果它们尚未发送)。

    这可能有助于说服IE,PDF的内容没有改变。我不认为这个解决方案会起作用,因为IE显然很顽固,但值得一提。

嗯,问题的一个显而易见的方法是使用URL重写。如果IE在扩展中使用.pdf,则使用mod_rewrite(Apache)或类似工具将服务器端重定向到右侧页面,同时使客户端认为它确实在请求PDF文件。

另外:使用像Fiddler这样的工具查看客户端正在接收的HTTP标头。

另外:查看这个较旧的问题( PHP:强制文件下载和IE,又一次),我也有类似的问题IE也没有强制下载。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top