从追加的字符集为二进制内容类型

问题描述:

防止Tomcat的我们有基础的Restlet服务,返回以下回应:我们有查看PDF问题从追加的字符集为二进制内容类型

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浏览器特别是)。

从实验和研究看来,问题与jBoss/Tomcat将charset = UTF-8附加到内容类型中,导致浏览器感知其接收的文本数据不是二进制数据。

有没有人知道阻止jBoss/Tomcat将字符集附加到二进制数据的内容类型的方法?

在此阶段,我一直无法阻止Tomcat将charset = UTF-8附加到Content-Type标题,导致Chrome PDFViewer(内部PDF查看器)无法查看PDF文档。

在试验过程中,我发现如果我没有返回Content-Length并设置Transfer-Encoding = chunked,那么PDF的浏览器可以通过Chrome的PDFViewer查看。这是目前的解决方法,但可能是一个脆弱的解决方案。

+0

实际上,当你没有设置Content-Length标题时,它是默认的响应编码。您不需要明确地设置自己的Transfer-Encoding标头。 – BalusC 2011-05-14 21:28:09

的servletcontainer确实,只有当您在代码中有一个

response.setCharacterEncoding("UTF-8"); 

地方。另见javadoc。设置字符编码对二进制数据没有意义,所以不要在二进制数据请求中这样做。

就我而言,原来是Spring的CharacterEncodingFilter。如果将forceEncoding设置为true,则会将字符编码添加到内容类型,即使对于二进制数据没有意义。

为了解决该问题,请将forceEncoding设置为false或将其保留为默认设置。并验证它的效果,例如对JSON响应。