我们使用ssm开发时,在前台通过接口请求到后台的数据展示在浏览器上的时候产生了乱码问题,分析了springMVC产生乱码的原因
springMVC中产生的响应有两种
1、ModelAndVIew
2、返回数据响应
在返回数据响应时使用消息转化器完成
在springMVC配置文件中的
<!-- 注解驱动中默认配置了消息转化器 -->
<mvc:annotation-driven />
而消息转化器中默认的编码格式是”IOS-8859-1”所以不支持中文格式
解决乱码
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg index="0" value="UTF-8"/>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
2、扩展CallbackMappingJackson2HttpMessageConverter
package com.taotao.common.spring.exetend.converter.json;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import com.fasterxml.jackson.core.JsonEncoding;
import com.fasterxml.jackson.core.JsonProcessingException;
public class CallbackMappingJackson2HttpMessageConverter extends MappingJackson2HttpMessageConverter {
// 做jsonp的支持的标识,在请求参数中加该参数
private String callbackName;
@Override
protected void writeInternal(Object object, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
// 从threadLocal中获取当前的Request对象
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
String callbackParam = request.getParameter(callbackName);
if(StringUtils.isEmpty(callbackParam)){
// 没有找到callback参数,直接返回json数据
super.writeInternal(object, outputMessage);
}else{
JsonEncoding encoding = getJsonEncoding(outputMessage.getHeaders().getContentType());
try {
String result =callbackParam+"("+super.getObjectMapper().writeValueAsString(object)+");";
IOUtils.write(result, outputMessage.getBody(),encoding.getJavaName());
}
catch (JsonProcessingException ex) {
throw new HttpMessageNotWritableException("Could not write JSON: " + ex.getMessage(), ex);
}
}
}
public String getCallbackName() {
return callbackName;
}
public void setCallbackName(String callbackName) {
this.callbackName = callbackName;
}
}
重写之后再springMVC配置文件中配置
<!-- 配置注解驱动 -->
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<bean
class="com.taotao.common.spring.exetend.converter.json.CallbackMappingJackson2HttpMessageConverter">
<property name="callbackName" value="callback"></property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>