java后台全局加密解密

大部分人的第一反应是通过 Spring 拦截器(Interceptor)中的postHandler方法处理。实际这是行不通的,因为当程序运行到该方法,是在返回数据之后,渲染页面之前,所以这时候 Response 中的输出流已经关闭了,自然无法在对返回数据进行处理。

其实这个问题用几行代码就可以搞定,因为 Spring 提供了非常丰富的扩展支持,无论是之前提到的InterceptorMethodArgumentResolver,还是接下来要提到的HttpMessageConverter

在 Spring MVC 的 Controller 层经常会用到@RequestBody@ResponseBody,通过这两个注解,可以在 Controller 中直接使用 Java 对象作为请求参数和返回内容,而完成这之间转换作用的便是HttpMessageConverter

HttpMessageConverter接口提供了 5 个方法:

  • canRead:判断该转换器是否能将请求内容转换成 Java 对象
  • canWrite:判断该转换器是否可以将 Java 对象转换成返回内容
  • getSupportedMediaTypes:获得该转换器支持的 MediaType 类型
  • read:读取请求内容并转换成 Java 对象
  • write:将 Java 对象转换后写入返回内容

    其中readwrite方法的参数分别有有HttpInputMessageHttpOutputMessage对象,这两个对象分别代表着一次 Http 通讯中的请求和响应部分,可以通过getBody方法获得对应的输入流和输出流。

具体步骤:这里使用的springBoot的方法进行配置

首先继承MappingJackson2HttpMessageConverter并重写 writeInternal 方法

package com.wjyb.server.wx.expand.filter;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.lang.reflect.Type;

/**
 * @author lyc
 * @Description:
 * @create 2019-01-02
 */
@Component
public class MyMappingJackson2HttpMessageConverter extends MappingJackson2HttpMessageConverter {

    Logger logger = LoggerFactory.getLogger(getClass());

    @Override
    protected void writeInternal(Object object, @Nullable Type type, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
        // 使用 Jackson 的 ObjectMapper 将 Java 对象转换成 Json String
        ObjectMapper mapper = new ObjectMapper ();
        String json = mapper.writeValueAsString (object);
        logger.info ("原来的json"+json);
        // 加密
        String result = json + "加密了!";
        logger.info ("加密后的json"+result);
        // 输出
        outputMessage.getBody ().write (result.getBytes ());
    }


}

然后实现WebMvcConfigurer,需要将这个自定义的转换器配置到 Spring 中,这里通过重写WebMvcConfigurer中的configureMessageConverters方法添加自定义转换器

package com.wjyb.server.wx.expand.filter;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import javax.annotation.Resource;
import java.io.IOException;
import java.util.List;

/**
 * @author lyc
 * @Description:
 * @create 2018-12-28
 */

@Configuration
public class Test implements WebMvcConfigurer {

    @Resource
    private MyMappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter;

    Logger logger = LoggerFactory.getLogger(getClass());

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add (mappingJackson2HttpMessageConverter);
    }

}

完成这只是个大概的实现步骤,其他细节就靠你自己了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章