Spring MVC中@responsebody或@RestController后对response数据进行加密修改,并去除字符串的双引号

本文介绍了如何在Spring MVC中利用@responsebody和@RestController注解后,对响应数据进行加密操作,并详细讲解了去除字符串双引号的两种方法:一是实现ResponseBodyAdvice接口来拦截并修改返回值;二是自定义MappingJackson2HttpMessageConverter工厂类,并在Spring MVC配置中进行设置。

一、通过实现ResponseBodyAdvice接口对返回值再输出之前进行了修改 

import org.apache.log4j.Logger;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.http.server.ServletServerHttpRequest;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;

@ControllerAdvice
public class EcryptResponseBodyAdvice implements ResponseBodyAdvice<Object> {
 
    private static Logger logger = Logger.getLogger(EcryptResponseBodyAdvice.class);
 
    private final ObjectMapper objectMapper = new ObjectMapper();
 
    @Override
    public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
        return true;
    }
 
    @Override
    public Object beforeBodyWrite(Object body, MethodParameter methodParameter,
                                  MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass,
                                  ServerHttpRequest serverHttpRequest,
                                  ServerHttpResponse serverHttpResponse) {
        if (serverHttpRequest.getHeaders() != null && serverHttpRequest.getHeaders().size() > 0) {
            try {
                
                ServletServerHttpRequest ssReq = (ServletServerHttpRequest)serverHttpRequest;
                HttpServletRequest req = ssReq.getServletRequest();
                if (req.getParameter("decrypt")!=null) {//根据请求参数判断需不需要加密
                    if (body!=null) {
                        String RESPONSE_KEY=Configuration.get("response_key");

                        String jsonStr = JSONObject.toJSONString(body);

                        String respTxt = AESUtil.encryptHex(jsonStr, RESPONSE_KEY);
                        
                        return respTxt;
                    }    
                }
            } catch (Exception e) {
                logger.error(e.getMessage());
                return body;
            }
        }
        return body;
    }

二、去掉返回字符串带的双引号

1.创建一个MappingJackson2HttpMessageConverter的工厂类

import org.slf4j.Logger;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.util.StreamUtils;

import java.io.IOException;
import java.lang.reflect.Type;
import java.nio.charset.Charset;

import static org.slf4j.LoggerFactory.getLogger;

/**
 * Created by userwyh on 2017/3/4.
 */
public class MappingJackson2HttpMessageConverterFactory {
    private static final Logger logger = getLogger(MappingJackson2HttpMessageConverterFactory.class);
    public MappingJackson2HttpMessageConverter init() {
        return new MappingJackson2HttpMessageConverter(){
            /**
             * 重写Jackson消息转换器的writeInternal方法
             * SpringMVC选定了具体的消息转换类型后,会调用具体类型的write方法,将Java对象转换后写入返回内容
             */
            @Override
            protected void writeInternal(Object object, Type type, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
                if (object instanceof String){
                    logger.info("在MyResponseBodyAdvice进行转换时返回值变成String了,不能用原来选定消息转换器进行转换,直接使用StringHttpMessageConverter转换");
                    //StringHttpMessageConverter中就是用以下代码写的
                    Charset charset = this.getContentTypeCharset(outputMessage.getHeaders().getContentType());
                    StreamUtils.copy((String)object, charset, outputMessage.getBody());
                }else{
                    logger.info("返回值不是String类型,还是使用之前选择的转换器进行消息转换");
                    super.writeInternal(object, type, outputMessage);
                }
            }
            private Charset getContentTypeCharset(MediaType contentType) {
                return contentType != null && contentType.getCharset() != null?contentType.getCharset():this.getDefaultCharset();
            }
        };
    }
}

2.在spring mvc的配置文件中添加如下配置

<mvc:annotation-driven>
        <mvc:message-converters>
            <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>image/jpeg</value>
                        <value>image/png</value>
                        <value>image/gif</value>
                    </list>
                </property>
            </bean>
            <bean  factory-bean="mappingJackson2HttpMessageConverterFactory" factory-method="init"
                   class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" >
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

    <bean id="mappingJackson2HttpMessageConverterFactory" class = "com.common.MappingJackson2HttpMessageConverterFactory" />

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值