`
rensanning
  • 浏览: 3548899 次
  • 性别: Icon_minigender_1
  • 来自: 大连
博客专栏
Efef1dba-f7dd-3931-8a61-8e1c76c3e39f
使用Titanium Mo...
浏览量:38156
Bbab2146-6e1d-3c50-acd6-c8bae29e307d
Cordova 3.x入门...
浏览量:607321
C08766e7-8a33-3f9b-9155-654af05c3484
常用Java开源Libra...
浏览量:682352
77063fb3-0ee7-3bfa-9c72-2a0234ebf83e
搭建 CentOS 6 服...
浏览量:89359
E40e5e76-1f3b-398e-b6a6-dc9cfbb38156
Spring Boot 入...
浏览量:401861
Abe39461-b089-344f-99fa-cdfbddea0e18
基于Spring Secu...
浏览量:69699
66a41a70-fdf0-3dc9-aa31-19b7e8b24672
MQTT入门
浏览量:91724
社区版块
存档分类
最新评论

Spring REST API 的 Accept-Charset 响应头

 
阅读更多
基于 Spring 的 REST API,发现响应头里的 Accept-Charset 非常巨大
引用
Accept-Charset: big5, big5-hkscs, cesu-8, euc-jp, euc-kr, gb18030, gb2312, gbk, ibm-thai, ibm00858, ibm01140, ibm01141, ibm01142, ibm01143, ibm01144, ibm01145, ibm01146, ibm01147, ibm01148, ibm01149, ibm037, ibm1026, ibm1047, ibm273, ibm277, ibm278, ibm280, ibm284, ibm285, ibm290, ibm297, ibm420, ibm424, ibm437, ibm500, ibm775, ibm850, ibm852, ibm855, ibm857, ibm860, ibm861, ibm862, ibm863, ibm864, ibm865, ibm866, ibm868, ibm869, ibm870, ibm871, ibm918, iso-2022-cn, iso-2022-jp, iso-2022-jp-2, iso-2022-kr, iso-8859-1, iso-8859-13, iso-8859-15, iso-8859-2, iso-8859-3, iso-8859-4, iso-8859-5, iso-8859-6, iso-8859-7, iso-8859-8, iso-8859-9, jis_x0201, jis_x0212-1990, koi8-r, koi8-u, shift_jis, tis-620, us-ascii, utf-16, utf-16be, utf-16le, utf-32, utf-32be, utf-32le, utf-8, windows-1250, windows-1251, windows-1252, windows-1253, windows-1254, windows-1255, windows-1256, windows-1257, windows-1258, windows-31j, x-big5-hkscs-2001, x-big5-solaris, x-compound_text, x-euc-jp-linux, x-euc-tw, x-eucjp-open, x-ibm1006, x-ibm1025, x-ibm1046, x-ibm1097, x-ibm1098, x-ibm1112, x-ibm1122, x-ibm1123, x-ibm1124, x-ibm1364, x-ibm1381, x-ibm1383, x-ibm300, x-ibm33722, x-ibm737, x-ibm833, x-ibm834, x-ibm856, x-ibm874, x-ibm875, x-ibm921, x-ibm922, x-ibm930, x-ibm933, x-ibm935, x-ibm937, x-ibm939, x-ibm942, x-ibm942c, x-ibm943, x-ibm943c, x-ibm948, x-ibm949, x-ibm949c, x-ibm950, x-ibm964, x-ibm970, x-iscii91, x-iso-2022-cn-cns, x-iso-2022-cn-gb, x-iso-8859-11, x-jis0208, x-jisautodetect, x-johab, x-macarabic, x-maccentraleurope, x-maccroatian, x-maccyrillic, x-macdingbat, x-macgreek, x-machebrew, x-maciceland, x-macroman, x-macromania, x-macsymbol, x-macthai, x-macturkish, x-macukraine, x-ms932_0213, x-ms950-hkscs, x-ms950-hkscs-xp, x-mswin-936, x-pck, x-sjis_0213, x-utf-16le-bom, x-utf-32be-bom, x-utf-32le-bom, x-windows-50220, x-windows-50221, x-windows-874, x-windows-949, x-windows-950, x-windows-iso2022jp


查了一下源码,发现默认的 StringHttpMessageConverter 会加上 Accept-Charset 响应头,并带上所有的字符集!这个选项需要通过设置 writeAcceptCharset 属性来关闭。

org.springframework.http.converter.StringHttpMessageConverter

private boolean writeAcceptCharset = true;

if (this.writeAcceptCharset) {
  outputMessage.getHeaders().setAcceptCharset(getAcceptedCharsets());
}


this.availableCharsets = new ArrayList<>(Charset.availableCharsets().values());

protected List<Charset> getAcceptedCharsets() {
  return this.availableCharsets;
}


也有人反映,为什么 writeAcceptCharset 属性不初始化为fale,https://jira.spring.io/browse/SPR-7316

源码中也注释了,可以通过子类覆盖 getAcceptedCharsets() 方法来返回该有的charsets。
/**
  * Return the list of supported {@link Charset}s.
  * <p>By default, returns {@link Charset#availableCharsets()}.
  * Can be overridden in subclasses.
  * @return the list of accepted charsets
  */
protected List<Charset> getAcceptedCharsets() {
  return this.availableCharsets;
}


XML配置:
<bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter">
    <constructor-arg value="UTF-8"></constructor-arg>
    <property name="writeAcceptCharset" value="false"/>
</bean>


Java配置:
StringHttpMessageConverter stringHttpMessageConverter = new StringHttpMessageConverter(Charset.forName("UTF-8"));
stringHttpMessageConverter.setWriteAcceptCharset(false);


SpringBoot已经通过自动配置关闭了这个选项
org.springframework.boot.autoconfigure.web.HttpMessageConvertersAutoConfiguration
@Bean
@ConditionalOnMissingBean
public StringHttpMessageConverter stringHttpMessageConverter() {
  StringHttpMessageConverter converter = new StringHttpMessageConverter(this.encodingProperties.getCharset());
  converter.setWriteAcceptCharset(false);
  return converter;
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics