Spring Boot - 加密JSON数据

Raj*_*Raj 9 spring json jackson spring-boot

在我们的应用程序中,我们必须为每个请求和响应加密/解密Json属性值(而不是属性名称).例,
{"userName":"encrypted value", "email":"encrypted value"}

我们使用Sprint boot 1.3,我们使用@RequestBody@ResponseBody注释将请求json与对象绑定,并将响应对象序列化为JSON.

我们不想在每个控制器方法中调用encrypt/decrypt方法.有没有什么办法可以指示sprint在绑定请求对象之前解密json值?同样,在将响应对象字段值转换为json之前对其进行加密?或者定制杰克逊可以帮助我们?

谢谢!

epa*_*van 12

您可以编写自己的http消息转换器.由于您使用的是弹簧启动,因此非常简单:只需扩展自定义转换器AbstractHttpMessageConverter并使用@Component注释标记类.

春季文档:

您可以通过在Spring Boot上下文中添加该类型的bean来提供其他转换器.如果你添加的bean是默认包含的类型(比如MappingJackson2HttpMessageConverter用于JSON转换),那么它将替换默认值.

这是一个简单的例子:

@Component
public class Converter extends AbstractHttpMessageConverter<Object> {

    public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");

    @Inject
    private ObjectMapper objectMapper;

    public Converter(){
        super(MediaType.APPLICATION_JSON_UTF8,
            new MediaType("application", "*+json", DEFAULT_CHARSET));
    }

    @Override
    protected boolean supports(Class<?> clazz) {
        return true;
    }

    @Override
    protected Object readInternal(Class<? extends Object> clazz,
                                  HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
        return objectMapper.readValue(decrypt(inputMessage.getBody()), clazz);
    }

    @Override
    protected void writeInternal(Object o, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
        outputMessage.getBody().write(encrypt(objectMapper.writeValueAsBytes(o)));
    }

    private InputStream decrypt(InputStream inputStream){
        // do your decryption here 
        return inputStream;
    }

    private byte[] encrypt(byte[] bytesToEncrypt){
        // do your encryption here 
        return bytesToEncrypt;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @Jezor 在“readInternal”中使用“inputMessage.getHeaders()”,在“writeInternal”中也使用相同的方法。 (2认同)