Java 阻止Tomcat强制执行ISO-8859-1

Java 阻止Tomcat强制执行ISO-8859-1,java,tomcat,Java,Tomcat,不管出于什么原因,ApacheTomcat/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)

不管出于什么原因,ApacheTomcat/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);

发送

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
我很确定,这是托克卡特的错

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>

AddDefaultCharsetFilter
org.apache.catalina.filters.AddDefaultCharsetFilter
编码
UTF-8
AddDefaultCharsetFilter
/*
但是没有任何效果。

存在许多(潜在)问题:

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没有说您可以/应该这样设置,并且
  • 如果通过setContentType和setCharacterEncoding(以及要引导的setHeader)设置字符编码,则不清楚什么优先
最好按照javadocs所说/显示的方式来做。。。特别是如果你想要便携性

4) 为什么过滤器不工作


这是一个猜测:可能是因为您已经在servlet中设置/试图设置编码?该过滤器设置>>默认值编辑配置后是否确保重新启动任何受影响的服务?@bhooks我确定我重新启动了Apache并重新部署了servlet(多次)。还有另一个过滤器,它通过这种方式变得有效,所以这不应该是问题(并且它应该在没有任何过滤器的情况下工作)。请注意,我只关心内容,URI只是简单的ASCII。1)这只是一个输入错误。2) 为什么??3) 就这样!非常感谢!它与
response.setContentType(“application/json;charset=utf-8”)
一起工作。还有一些不清楚的地方:4)为什么过滤器不能工作?5) 为什么太迟了?以前没有写过任何东西。
   String JSON_MEDIA_TYPE = "application/json; charset=utf-8";
   response.setContentType(JSON_MEDIA_TYPE);