在和客户端中的接口交互时,要取得更高的安全性,幸运飞艇网站制作q<217.17.9.34.0.8>或许我们需要对其进行加密(请求参数加密和服务端解密)、信息返回加密(服务端加密和客户端解密),然后不是所有接口都如此,有些接口可能不用,可以通过注解来简单达到此要求。
将接口参数的加密解密和返回信息的加密解密分开,分别定义注解,利用Controller的ControllerAdvice来拦截所有的请求,在其中判断是否需要加密解密,即可达到要求。
使用方法:使用 DecryptRequest 和 EncryptResponse 注解即可,可以放在Controller的类和方法上,其中一个为false就不执行了。像这样:
@RestController
@RequestMapping("/test")
//@DecryptRequest
@EncryptResponse
public class TestController {
@Autowired
@Qualifier("rrCrypto")
private Crypto crypto;
@DecryptRequest(false)
@EncryptResponse(false)
@RequestMapping(value = "/enc" , method = RequestMethod.POST)
public String enc(@RequestBody String body){
return crypto.encrypt(body);
}
}
定义参数解密的注解,DecryptRequest。
/**
* 解密注解
*
* <p>加了此注解的接口(true)将进行数据解密操作(post的body) 可
* 以放在类上,可以放在方法上 </p>
* @author xiongshiyan
*/
@Target({ElementType.METHOD , ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DecryptRequest {
/**
* 是否对body进行解密
*/
boolean value() default true;
}
定义返回信息加密的注解,EncryptResponse。
/**
* 加密注解
*
* <p>加了此注解的接口(true)将进行数据加密操作
* 可以放在类上,可以放在方法上 </p>
* @author 熊诗言
*/
@Target({ElementType.METHOD , ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface EncryptResponse {
/**
* 是否对结果加密
*/
boolean value() default true;
}
这两个注解可以放在类和方法上,遵循一样的逻辑,即:类上的注解 && 方法上的注解,一方没有即为true,都为false为false。逻辑主要在 NeedCrypto 中。
原文地址:https://www.cnblogs.com/gaoxingyixia/p/11286755.html