老鬼的博客 来都来啦,那就随便看看吧~
springboot接口加解密处理
发布于: 2022-10-13 更新于: 2022-10-13 分类于:  阅读次数: 

一:介绍

1
使用切面的方式做到接口的加解密处理

二:方法

2.1 定义注解

  • Decrypt.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.tohours.cnTools.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
* @desc 解密的注解
* @author RenJie
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD}) //可以定义在类和方法上
@Documented
public @interface Decrypt {
}
  • Encrypt.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package com.tohours.cnTools.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
* @desc 加密
* @author RenJie
*
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD}) //可以定义在类和方法上
public @interface Encrypt {
}

2.2 定义是否加解密开关

  • application.yml
1
2
3
# 是否对接口进行加解密处理
isDecrypt: true # 是否解密
isEncrypt: true # 是否加密

2.3 定义切面

  • DecryptAspect.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package com.tohours.cnTools.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import com.tohours.cnTools.utils.AesJsUtils;

import lombok.extern.slf4j.Slf4j;

/**
* @desc 加解密 API日志切面
* @Date 2022-10-13
*/
@Slf4j
@Aspect
@Component
public class DecryptAspect {


//是否解密
@Value("${isDecrypt}")
private Boolean isDecrypt;


/**
* 以自定义 @Secret 注解为切点
*/
@Pointcut("@within(com.tohours.cnTools.annotation.Decrypt) || @annotation(com.tohours.cnTools.annotation.Decrypt)")
public void decrypt() {
}

@Around("decrypt()")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
// 获取参数名称和值
Object[] args = joinPoint.getArgs();
if(isDecrypt) {
MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
String[] parameterNames = methodSignature.getParameterNames();
for (int i = 0; i < parameterNames.length; i++) {
if (i >= args.length) {
break;
}
Object value = args[i];
String name = parameterNames[i];
log.info("name:" + name);
log.info("value:" + value);
args[i] = AesJsUtils.decrypt(value.toString());
}
}
//执行方法
Object result = joinPoint.proceed(args);
return result;
}
}

  • EncryptAspect.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package com.tohours.cnTools.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.tohours.cnTools.support.TohoursResponse;
import com.tohours.cnTools.support.TohoursResult;
import com.tohours.cnTools.utils.AesJsUtils;

import lombok.extern.slf4j.Slf4j;

/**
* @desc 加解密 API日志切面
* @Date 2022-10-13
*/
@Slf4j
@Aspect
@Component
public class EncryptAspect {

//是否加密
@Value("${isEncrypt}")
private Boolean isEncrypt;




/**
* 以自定义 @Secret 注解为切点
*/
@Pointcut("@within(com.tohours.cnTools.annotation.Encrypt) || @annotation(com.tohours.cnTools.annotation.Encrypt)")
public void encrypt() {
}

@Around("encrypt()")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
//执行方法
Object result = joinPoint.proceed();
if(isEncrypt) {
log.info("加密处理前:" + result);
JSONObject rv = JSONObject.parseObject(JSON.toJSONString(result));
Object resData = rv.get("resData");
String encrypt = AesJsUtils.encrypt(resData.toString());
TohoursResult<Object> success = TohoursResponse.success(encrypt);
return success;
}else {
return result;
}

}
}

2.4 Controller层

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package com.tohours.cnTools.controller.test;

import java.util.UUID;

import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.tohours.cnTools.annotation.Decrypt;
import com.tohours.cnTools.annotation.Encrypt;
import com.tohours.cnTools.controller.BaseController;
import com.tohours.cnTools.model.DirectChargeModel;
import com.tohours.cnTools.support.TohoursResponse;
import com.tohours.cnTools.support.TohoursResult;
import com.tohours.cnTools.utils.cq.CQUtils;

import lombok.extern.slf4j.Slf4j;

@RestController
@RequestMapping("/cq")
@SuppressWarnings("rawtypes")
@Slf4j
public class CQTestController extends BaseController {


@RequestMapping(value = "test")
@Decrypt
@Encrypt
public TohoursResult<Object> test(String test) {
log.info("test:" + test);
return TohoursResponse.success(test);
}
}

  • 备注
1
2
3
4
5
@Decrypt 
@Encrypt
这两个注解可以定义到方法上也可以定义到类上,
如果这个Controller的都需要进行加解密则统一
可以放在类上
*************感谢您的阅读*************