在IE中启用pdf缓存

时间:2009-11-27 09:49:37

标签: java internet-explorer pdf caching acrobat

首先,缓存在所有浏览器中都不起作用。然后我通过在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则没有。

3 个答案:

答案 0 :(得分:1)

要考虑的一些想法:

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

    尝试使用public的值,或private,如果这更适合您的内容。查看RFC 2616了解详情。

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

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

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

    这也是可能的 你正在发送浏览器 有冲突的Cache-Control / Pragma 标题和IE选择采取 无论出于何种倒退原因,Pragma标题都是首要任务。

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

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

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

    由于来自RFC 2616的这一要求,IE无论响应中的标头是什么都允许缓存发生:“默认情况下,如果请求方法,请求标头字段的要求,则响应可缓存< strong>和响应状态表明它是可缓存的。“对POST个请求的响应不可缓存,因此IE不应在其请求中包含该标头。

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

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

答案 1 :(得分:1)

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

至于IE不遵守embedobject元素中的服务器端缓存控制规则,遗憾的是这是IE的“功能”。最好的方法是用iframe元素替换它。

其他标题如expireslast-modifiedetag等等都无济于事。

答案 2 :(得分:0)

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

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

另外:回顾一下这个较老的问题(PHP: Force file download and IE, yet again),我也遇到了类似IE的问题,也没有强制下载。