我们有一个基于Restlet的服务,它返回以下响应:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1, Restlet-Framework/2.0.7
X-Powered-By: Servlet 2.4; JBoss-4.2.3.GA (build: SVNTag=JBoss_4_2_3_GA date=200807181417)/JBossWeb-2.0
Content-Disposition: inline; filename=Time_for_a_breather.pdf
Date: Fri, 13 May 2011 23:41:24 GMT
Accept-Ranges: bytes
Content-Type: application/pdf;charset=UTF-8
Content-Length: 218495
但遗憾的是在某些浏览器中(特别是Chrome),我们在查看pdf时遇到了问题。
从实验和研究来看,问题似乎与jBoss / Tomcat将charset = UTF-8附加到内容类型有关,这导致浏览器感知其接收的文本数据不是二进制数据。
有没有人知道防止jBoss / Tomcat将charset附加到二进制数据的内容类型的方法?
答案 0 :(得分:0)
在此阶段,我无法阻止Tomcat将charset = UTF-8附加到Content-Type标头,导致Chrome PDFViewer(内部PDF查看器)无法查看PDF文档。
在进行实验时,我发现如果我没有返回Content-Length并设置Transfer-Encoding = chunked,则Chrome的PDFViewer可以查看PDF。目前这是一种解决方法,但可能是一个脆弱的解决方案。
答案 1 :(得分:0)
只有当你有
时,servletcontainer才会这样做response.setCharacterEncoding("UTF-8");
代码中的某处。另请参阅javadoc。设置字符编码对于二进制数据没有意义,所以不要对二进制数据的请求这样做。
答案 2 :(得分:0)
就我而言,事实证明是春天CharacterEncodingFilter
。如果将forceEncoding
设置为true
,它会将字符编码添加到内容类型中,即使它对二进制数据没有任何意义。
要解决此问题,请将forceEncoding
设置为false
或将其保留为默认设置。并验证它具有的效果,例如关于JSON回复。