赞
踩
因为有小伙伴刚好问到 RequestBodyAdvice 的用法,松哥就抽空撸一篇文章和大家聊聊这个话题。
加密解密本身并不是难事,问题是在何时去处理?定义一个过滤器,将请求和响应分别拦截下来进行处理也是一个办法,这种方式虽然粗暴,但是灵活,因为可以拿到一手的请求参数和响应数据。不过 SpringMVC 中给我们提供了 ResponseBodyAdvice 和 RequestBodyAdvice,利用这两个工具可以对请求和响应进行预处理,非常方便。
所以今天这篇文章有两个目的:
分享参数/响应加解密的思路。
分享 ResponseBodyAdvice 和 RequestBodyAdvice 的用法。
好了,那么接下来就不废话了,我们一起来看下。
为了让我们开发的这个工具更加通用,也为了复习一下自定义 Spring Boot Starter,这里我们就将这个工具做成一个 stater,以后在 Spring Boot 项目中直接引用就可以。
首先我们创建一个 Spring Boot 项目,引入 spring-boot-starter-web 依赖:
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- <scope>provided</scope>
- <version>2.4.3</version>
- </dependency>
因为我们这个工具是为 Web 项目开发的,以后必然使用在 Web 环境中,所以这里添加依赖时 scope 设置为 provided。
依赖添加完成后,我们先来定义一个加密工具类备用,加密这块有多种方案可以选择,对称加密、非对称加密,其中对称加密又可以使用 AES、DES、3DES 等不同算法,这里我们使用 Java 自带的 Cipher 来实现对称加密,使用 AES 算法:
- public class AESUtils {
-
- private static final String AES_ALGORITHM = "AES/ECB/PKCS5Padding";
-
- // 获取 cipher
- private static Cipher getCipher(byte[] key, int model) throws Exception {
- SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");
- Cipher cipher = Cipher.getInstance(AES_ALGORITHM);
- cipher.init(model, secretKeySpec);
- return cipher;
- }
-
- // AES加密
- public static String encrypt(byte[] data, byte[] key) throws Exception {
- Cipher cipher = getCipher(key, Cipher.ENCRYPT_MODE);
- return Base64.getEncoder().encodeToString(cipher.doFinal(data));
- }
-
- // AES解密
- public static byte[] decrypt(byte[] data, byte[] key) throws Exception {
- Cipher cipher = getCipher(key, Cipher.DECRYPT_MODE);
- return cipher.doFinal(Base64.getDecoder().decode(data));
- }
- }
这个工具类比较简单,不需要多解释。需要说明的是,加密后的数据可能不具备可读性,因此我们一般需要对加密后的数据再使用 Base64 算法进行编码,获取可读字符串。换言之,上面的 AES 加密方法的返回值是一个 Base64 编码之后的字符串,AES 解密方法的参数也是一个 Base64 编码之后的字符串,先对该字符串进行解码,然后再解密。
接下来我们封装一个响应工具类备用,这个大家如果经常看松哥视频已经很了解了:
- public class RespBean {
- private Integer status;
- private String msg;
- private Object obj;
-
- public static RespBean build() {
- return new RespBean();
- }
-
- public static RespBean ok(String msg) {
- return new RespBean(200, msg, null);
- }
-
- public static RespBean ok(String msg, Object obj) {
- return new RespBean(200, msg, obj);
- }
-
- public static RespBean error(String msg) {
- return new RespBean(500, msg, null);
- }
-
- public static RespBean error(String msg, Object obj
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。