SpringMVC 學習-返回字符串中文亂碼問題解決


一、使用 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;
}

以上。

擺脫亂碼困擾。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM