一、使用 SpringMVC 框架時,如果 HTTP 請求資源返回的是中文字符串,則會出現亂碼。原因如下:
SpringMVC 框架可以使用 @RequestBody 和 @ResponseBody 兩個注解,分別完成請求到對象和對象到響應的轉換,底層這種靈活的響應機制,就是Spring3.X 新引入的 HttpMessageConverter 即消息轉換器機制。該機制默認的編碼為 ISO-8859-1。
源碼如下:
public class StringHttpMessageConverter extends AbstractHttpMessageConverter<String> { public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");
二、那這種情況該怎么解決呢
經本人測試有效的解決辦法,有如下兩個:
1. 在 @RequestMapping 里面加入 produces="text/html;charset=UTF-8"
@ResponseBody @RequestMapping(value="/logon",produces="text/html; charset=UTF-8") public String logon(){ }
這種方式的不足之處在於,我們的每個 controller 都需要這么配置,算是比較麻煩。
那還有其他省事的、一勞永逸的辦法嗎?有的。
2. 使用 Spring 的后置處理器 BeanPostProcessor
對這個類不太了解的,見:http://www.cnblogs.com/libra0920/p/6118157.html 有一個簡單的說明。
在 bean 實例化之后,當 bean 的類型為 StringHttpMessageConverter 時,設置 @responseBody 返回數據編碼為 utf8 格式。
/** * 實例化之后進行處理 */ public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { if(bean instanceof StringHttpMessageConverter){ MediaType mediaType = new MediaType("text", "plain", Charset.forName("UTF-8")); List<MediaType> types = new ArrayList<MediaType>(); types.add(mediaType); ((StringHttpMessageConverter) bean).setSupportedMediaTypes(types); } return bean; }
以上。
擺脫亂碼困擾。
