[英]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
之后調用setCharacterEncoding
和setContentType
,則它們將無效1 。
更新
2)為什么?
因為:
最好按照javadocs所說的/顯示的方式來做事情,尤其是如果您想要可移植性。
4)為什么過濾器不起作用?
這是一個猜測:可能是因為您已經設置/嘗試設置servlet中的編碼? 該過濾器設置>> default <<字符集。
5)為什么為時已晚? 以前沒有寫任何東西。
因為javadoc說是對getWriter()
等的調用才能“提交”響應頭。
1-即,對發送給客戶端的響應沒有影響。 HttpServletResponse
對象可能反映了您所進行的調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.