首先,缓存在所有浏览器中都不起作用。然后我通过在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则没有。
答案 0 :(得分:1)
要考虑的一些想法:
我认为cache
不是有效的Cache-Control
指令。
尝试使用public
的值,或private
,如果这更适合您的内容。查看RFC 2616了解详情。
也许你发送了不止一个
Cache-Control
指令?
使用工具
比如Firebug或
LiveHTTPHeaders偷看
您的浏览器的实际标头
接收。确保它们不是
得到你不期望的东西。
听起来你可能已经是
虽然这样做。另外,请确保您还没有发送Pragma: no-cache
。
尝试设置
除了使用之外,还有Expires
标题
Cache-Control
。
这也是可能的
你正在发送浏览器
有冲突的Cache-Control
/ Pragma
标题和IE选择采取
无论出于何种倒退原因,Pragma
标题都是首要任务。
确保IE配置为允许缓存! :)
Control Panel
>
Internet Options
>
Temporary Internet Files
>
Settings
>
Check for newer versions of stored pages
尝试发送PDF作为对POST
请求的回复(通过表单提交)。
由于来自RFC 2616的这一要求,IE无论响应中的标头是什么都允许缓存发生:“默认情况下,如果请求方法,请求标头字段的要求,则响应可缓存< strong>和响应状态表明它是可缓存的。“对POST
个请求的响应不可缓存,因此IE不应在其请求中包含该标头。
尝试使用一致的值发送Content-MD5
和Last-Modified
标头(如果它们尚未发送)。
这可能有助于说服IE,PDF的内容没有改变。我不认为这个解决方案会起作用,因为IE显然很顽固,但值得一提。
答案 1 :(得分:1)
如前所述,cache-control
标头值cache
无效。请改用public
。
至于IE不遵守embed
和object
元素中的服务器端缓存控制规则,遗憾的是这是IE的“功能”。最好的方法是用iframe
元素替换它。
其他标题如expires
,last-modified
,etag
等等都无济于事。
答案 2 :(得分:0)
嗯,问题的一个显而易见的方法是使用URL重写。如果IE在扩展中使用.pdf,则使用mod_rewrite(Apache)或类似工具将服务器端重定向到右侧页面,同时使客户端认为它确实在请求PDF文件。
另外:使用像Fiddler这样的工具查看客户端正在接收的HTTP标头。
另外:回顾一下这个较老的问题(PHP: Force file download and IE, yet again),我也遇到了类似IE的问题,也没有强制下载。