【问题标题】:Preventing Tomcat from appending charset to binary content types防止 Tomcat 将字符集附加到二进制内容类型
【发布时间】:2011-05-13 23:54:16
【问题描述】:

我们有一个基于 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 servlets restlet


    【解决方案1】:

    只有当你有一个 servletcontainer 时,它才会这样做

    response.setCharacterEncoding("UTF-8");
    

    在您的代码中的某处。另请参阅javadoc。设置字符编码对二进制数据没有意义,所以不要在请求二进制数据时这样做。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 其实是不设置Content-Length标头时的默认响应编码。您不需要自己明确设置 Transfer-Encoding 标头。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-15
        • 2019-08-27
        • 2019-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-27
        相关资源
        最近更新 更多