簡體   English   中英

阻止Tomcat強制執行ISO-8859-1

[英]Stop Tomcat from enforcing ISO-8859-1

無論出於什么原因,Apache Tomcat / 8.0.28(我沒有使用Spring,沒有JSP,只是一個普通的Servlet)都忽略了我

private static final String JSON_MEDIA_TYPE = "application/json; charset=utf-8";
response.setContentType(JSON_MEDIA_TYPE);

還有多余的

response.setHeader("Content-Type", JSON_MEDIA_TYPE);

response.setCharacterEncoding("UTF_8");

並發送

Content-Type: application/json;charset=ISO-8859-1

這是完全錯誤的(因為JSON始終為UTF-8),並破壞了我的輸出。 請求標頭包含

Accept:application/json, text/plain, */*
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3

我很確定,這是Tocmcat的錯,

Content-Tipe:application/json; charset=utf-8

(帶有故意的錯字)效果非常理想。

最初, web.xml沒有過濾器,然后我添加了

<filter>
    <filter-name>AddDefaultCharsetFilter</filter-name>
    <filter-class>org.apache.catalina.filters.AddDefaultCharsetFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>AddDefaultCharsetFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

但沒有任何效果。

存在許多(潛在)問題:

1)這行:

   response.setCharacterEncoding("UTF_8");

應該

   response.setCharacterEncoding("UTF-8");

2)您(可能)不應將內容編碼設置為內容類型的一部分:

   String JSON_MEDIA_TYPE = "application/json; charset=utf-8";
   response.setContentType(JSON_MEDIA_TYPE);

3)如果在調用getWriter / getOutputStream之后調用setCharacterEncodingsetContentType ,則它們將無效1


更新

2)為什么?

因為:

  • javadocs不會說您可以/應該這樣設置,並且
  • 如果同時通過setContentType和setCharacterEncoding(和setHeader啟動)設置字符編碼,則不清楚哪個優先

最好按照javadocs所說的/顯示的方式來做事情,尤其是如果您想要可移植性。

4)為什么過濾器不起作用?

這是一個猜測:可能是因為您已經設置/嘗試設置servlet中的編碼? 該過濾器設置>> default <<字符集。

5)為什么為時已晚? 以前沒有寫任何東西。

因為javadoc說是對getWriter()等的調用才能“提交”響應頭。


1-即,對發送給客戶端的響應沒有影響。 HttpServletResponse對象可能反映了您所進行的調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM