防止Tomcat将charset附加到二进制内容类型

时间:2011-05-13 23:54:16

标签: 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_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附加到二进制数据的内容类型的方法?

3 个答案:

答案 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回复。