以往的返回值加密,都是在配置文件中添加相关配置并编写加密方法,这种方法导致每次更改加密开关时,都需要重启项目,对于有这方面需求的项目是非常不方便的,而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;
}
@Override
public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
return optionService.getByKeyAsBoolean("response_body_encrypt");
}
@Override
public 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;
}
}