很多人都碰到過,SpringMVC使用 @ResponseBody 注解,返加字元串不做任何處理時,有可能會出現亂碼問題。
這是由于 StringHttpMessageConverter 類中,預設采用的字元集是 ISO-8859-1。
public class StringHttpMessageConverter extends AbstractHttpMessageConverter<String> {
public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");
private final Charset defaultCharset;
private final List<Charset> availableCharsets;
private boolean writeAcceptCharset = true;
/**
* A default constructor that uses {@code "ISO-8859-1"} as the default charset.
* @see #StringHttpMessageConverter(Charset)
*/
public StringHttpMessageConverter() {
this(DEFAULT_CHARSET);
}
那麼要解決亂碼問題,需要改變 StringHttpMessageConverter 中的預設字元集,本文中以UTF-8為例。
修改預設字付集:
<bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="UTF-8" index="0"/>
<property name="supportedMediaTypes">
<list>
<value>text/plain;charset=UTF-8</value>
</list>
</property>
</bean>
配置起效
方式一:
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="stringHttpMessageConverter"/>
<ref bean="jackson2HttpMessageConverter"/>
</list>
</property>
</bean>
<mvc:annotation-driven />
注:配置必須在 <mvc:annotation-driven /> 之前,否則将不會啟效;<mvc:annotation-driven /> 會自動注冊DefaultAnnotationHandlerMapping 與AnnotationMethodHandlerAdapter。
方式二:
<mvc:annotation-driven>
<mvc:message-converters>
<ref bean="stringHttpMessageConverter"/>
<ref bean="jackson2HttpMessageConverter"/>
</mvc:message-converters>
</mvc:annotation-driven>
在spring mvc中沒有直接使用預設配置,而是另外配置了json解析器
<!-- 傳回json 需要導入 fastjson.jar包 -->
<mvc:annotation-driven>
<mvc:message-converters register-defaults="false">
<!-- 避免IE執行AJAX時,傳回JSON出現下載下傳檔案 -->
<bean id="fastJsonHttpMessageConverter" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<!-- 這裡順序不能反,一定先寫text/html,不然ie下出現下載下傳提示 -->
<value>text/html;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
使用@responsebody注解并且傳回值類型為String時,傳回的string字元串帶有雙引号,其原因是直接将string類型轉成了json字元串,應該在json解析器之前添加字元串解析器
<bean class="org.springframework.http.converter.StringHttpMessageConverter"/>