13.1 Spring MVC 關(guān)于controller的字符編碼
問(wèn)題描述
在使用springMVC框架構(gòu)建web應(yīng)用芹彬,返回http請(qǐng)求json格式的數(shù)據(jù),中文亂碼会涎。
原因分析
我們通常使用@ResponseBody注解使 controller回應(yīng)相應(yīng)的數(shù)據(jù)而不是去渲染某個(gè)頁(yè)面裹匙。如果請(qǐng)求的是非英文格式的字符串,往往在客戶端顯示的是亂碼末秃。
原因是spring的 StringHttpMessageConverter默認(rèn)的字符類型是iso8895-1 ‘西歐語(yǔ)言’概页,在org.springframework.http.converter.StringHttpMessageConverter類中
public class StringHttpMessageConverter extends AbstractHttpMessageConverter<String> {
public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");
....
}
所以,我們使用中文等字符需要單獨(dú)指定练慕。
這里總結(jié)幾種解決方案:
1.不使用@ResponseBody注解惰匙,使用HttpServeletResponse設(shè)置contentType屬性
@RequestMapping(value ="/rest/create/document")
public void create(Document document, HttpServletRespone respone) {
repoonse.setContentType("text/plain;charset='utf-8'");
response.write("中文string");
}
2.返回Response Entity object,設(shè)置contentType铃将,例:
@RequestMapping(value = "/rest/create/document") public ResponseEntity<String> create(Document document, HttpServletRespone respone) {
HttpHeaders responseHeaders = new HttpHeaders(); responseHeaders.add("Content-Type", "text/html; charset=utf-8");
Document newDocument = DocumentService.create(Document);
String json = jsonSerializer.serialize(newDocument);
return new ResponseEntity<String>(json, responseHeaders, HttpStatus.OK);
}
3.使用produces屬性:
@RequestMapping(value = "/rest/create/document",produces= "text/plain;charset=UTF-8") //返回的內(nèi)容類型
@ResponseBody
public String create(Document document, HttpServletRespone respone) throws UnsupportedEncodingException {
Document newDocument = DocumentService.create(Document);
return jsonSerializer.serialize(newDocument);
}