2

起初,缓存并不适用于所有浏览器。然后我通过将 .pdf 扩展名添加到 url 使其在除 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,我使用 Adob​​e Reader 9.2.0。

如何让它在 IE 中也能工作?我注意到 IE 在request中添加了 'Cache-Control: no-cache' 标头,而 Safari 则没有。

4

3 回答 3

1

需要研究的一些想法:

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

    尝试使用值public代替,或者private如果这更适合您的内容。查看RFC 2616了解更多信息。

  2. 也许您要发送多个 Cache-Control指令?

    使用FirebugLiveHTTPHeaders 之类的工具来查看浏览器接收到的实际标头。确保他们没有得到你不期望的东西。听起来你可能已经在这样做了。还要确保您没有同时发送Pragma: no-cache.

  3. Expires除了使用 . 之外,尝试设置 标题Cache-Control

    也有可能您正在发送浏览器冲突的Cache-Control/标头,而 IE出于任何向后的原因Pragma 选择将 标头作为第一优先级。Pragma

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

    Control Panel> Internet Options> Temporary Internet Files> Settings> Check for newer versions of stored pages

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

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

  6. 尝试发送具有一致值的Content-MD5andLast-Modified标头(如果尚未发送它们)。

    这可能有助于让 IE 相信 PDF 的内容没有改变。我认为这个解决方案行不通,因为 IE 显然很顽固,但值得一提。

于 2009-12-04T02:10:13.987 回答
1

如前所述,cache-control标头值cache无效。改为使用public

embed至于 IE 在and元素中没有遵守服务器端缓存控制规则object,很遗憾这是 IE 的一个“特性”。你能做的最好的就是用一个iframe元素替换它。

其他标头,如expires,last-modifiedetag将无济于事。

于 2009-12-05T03:12:34.210 回答
0

好吧,解决该问题的一种明显方法是使用 URL 重写。如果 IE 在扩展名中使用 .pdf,请使用 mod_rewrite (Apache) 或类似工具将服务器端重定向到正确的页面,同时让客户端认为它确实在请求 PDF 文件。

另外:使用 Fiddler 等工具查看客户端接收到的 HTTP 标头。

另外:查看这个较旧的问题(PHP:再次强制文件下载和 IE),我也遇到过类似的问题,即 IE 不强制下载。

于 2009-12-02T07:40:23.577 回答