如果正在使用SpringBoot框架,那么来对地方了,如果是其他框架,那么看官就需要另外查阅资料

需求描述

对接口返回值进行加密,必须兼容老版本接口,而老版本接口不应加密,同时加密支持开关

实现方法

其实有很多种方式都可以实现上述功能,例如AOP、Filter等,我这边直接使用ResponseBodyAdvice对返回值进行修改

代码

新建EncryptResponseAdvice类,添加@ControllerAdvice注解,并设置basePackage为新接口所在的包

package com.w.module.api.advice;

import com.w.module.api.Encrypt;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
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.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

@ControllerAdvice(basePackages = "com.w.module.api")
public class EncryptResponseAdvice implements ResponseBodyAdvice<Object> {

    @Value("${system.api.encrypt}")
    private Boolean isEncrypt;

    @Autowired
    private Encrypt encrypt;

    @Override
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
        return true;
    }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        Object result = body;

        if (isEncrypt) {
            result = encrypt.build(body);
        }

        return result;
    }

}

因为需要配置加密的开关,所以这里使用@Value来获取application.properties中的加密配置 system.api.encrypt=true

另外贴上加密工具类Encrypt.java

package com.w.module.api;

import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.RSA;
import cn.hutool.json.JSONUtil;
import org.springframework.stereotype.Component;

@Component
public class Encrypt {

    String PRIVATE_KEY = "xxxxxx";

    String PUBLIC_KEY = "xxxx";

    public Object build(Object result){
        if (result != null) {
            RSA rsa = new RSA(PRIVATE_KEY, PUBLIC_KEY);
            String json= JSONUtil.toJsonStr(result);
            String encryptBase64 = rsa.encryptBase64(json, KeyType.PublicKey);
            result = encryptBase64;
        }
        return result;
    }

}

这个类中引用了hutool的部分工具类,hutool的版本是5.1.0

<dependency>
      <groupId>cn.hutool</groupId>
      <artifactId>hutool-all</artifactId>
     <version>5.1.0</version>
</dependency>

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!

如何使用 idea 远程调试 Java 代码 上一篇
CentOS安装RocketMQ 下一篇