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

被折叠的 条评论
为什么被折叠?



