以往的返回值加密,都是在配置文件中添加相关配置并编写加密方法,这种方法导致每次更改加密开关时,都需要重启项目,对于有这方面需求的项目是非常不方便的,而Asuka支持在全局配置中动态开关返回值加密,免去了重启项目之苦。
使用方法
- 后台管理-全局配置,设置加密开关为true/false

true代表加密,而false代表不加密
- 编辑
ApiEncryptResponseBodyAdvice.java- 所在位置:
com.asuka.common.advice - 注意事项:
- 如果修改了包名,同时需要修改
@ControllerAdvice的basePackages为新的包名 - 切记修改
SECRET,该属性为加密的密钥,应保证唯一性 - 如果需要针对不同的模块进行不同的加密处理,应创建多个Advice,每个Advice的
basePackages应保持独立
- 如果修改了包名,同时需要修改
- 所在位置:
源码示例
@ControllerAdvice(basePackages = "com.asuka.module.api")public class ApiEncryptResponseBodyAdvice implements ResponseBodyAdvice<Object> {// 切记修改密钥private final String SECRET = "QiXX#kEg^0A7XXsP";private static final Logger log = LoggerFactory.getLogger(ApiEncryptResponseBodyAdvice.class);private final OptionService optionService;public ApiEncryptResponseBodyAdvice(OptionService optionService) {this.optionService = optionService;}@Overridepublic boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {return optionService.getByKeyAsBoolean("response_body_encrypt");}@Overridepublic Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {if (o != null) {String json;if (o instanceof String) {json = String.valueOf(o);} else {json = JSON.toJSONString(o);}log.info("============ api response body : {} ==========", json);String encryptBase64 = SecureUtil.aes(SECRET.getBytes()).encryptBase64(json);log.info("============ api response body when encrypted and base64: {} ==========", encryptBase64);o = encryptBase64;}return o;}}
