解决springMVC在浏览器请求数据时产生的乱码问题

2 篇文章 0 订阅
1 篇文章 0 订阅

我们使用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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值