从追加的字符集为二进制内容类型
问题描述:
防止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查看。这是目前的解决方法,但可能是一个脆弱的解决方案。
答
的servletcontainer确实,只有当您在代码中有一个
response.setCharacterEncoding("UTF-8");
地方。另见javadoc。设置字符编码对二进制数据没有意义,所以不要在二进制数据请求中这样做。
答
就我而言,原来是Spring的CharacterEncodingFilter
。如果将forceEncoding
设置为true
,则会将字符编码添加到内容类型,即使对于二进制数据没有意义。
为了解决该问题,请将forceEncoding
设置为false
或将其保留为默认设置。并验证它的效果,例如对JSON响应。
实际上,当你没有设置Content-Length标题时,它是默认的响应编码。您不需要明确地设置自己的Transfer-Encoding标头。 – BalusC 2011-05-14 21:28:09