防止Tomcat将字符集附加到二进制内容类型

防止Tomcat将字符集附加到二进制内容类型,tomcat,servlets,restlet,Tomcat,Servlets,Restlet,我们有一个基于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_bre

我们有一个基于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将字符集附加到二进制数据的内容类型吗?

在这个阶段,我无法阻止Tomcat将charset=UTF-8附加到内容类型头,这导致Chrome PDFViewer(内部PDF查看器)无法查看PDF文档


在实验过程中,我发现如果我不返回内容长度并设置Transfer Encoding=chunked,则Chrome的PDFViewer可以查看PDF。目前这是一个解决方案,但可能是一个脆弱的解决方案。

只有当您有

response.setCharacterEncoding("UTF-8");

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

在我的例子中,结果是Spring的
字符编码过滤器。如果将
forceEncoding
设置为
true
,则它会将字符编码添加到内容类型,即使对二进制数据没有意义


要修复此问题,请将
forceEncoding
设置为
false
或保留默认设置。并验证它的效果,例如对JSON响应的影响。

实际上,当您不设置
内容长度
标题时,它是默认的响应编码。您不需要自己明确地设置
传输编码
头。