111
k94314517
2025-07-09 d5984685e7efd46a5e850ade13b22fa727163a47
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
package com.doumee.config.interfaceencryption;
 
import com.doumee.config.annotation.EncryptionResp;
import com.doumee.core.model.ApiResponse;
import com.doumee.core.utils.AESUtils;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
 
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.Random;
 
/**
 * github地址 http://www.github.com/wanyushu
 * gitee地址 http://www.gitee.com/wanyushu
 * @author yushu
 * @email 921784721@qq.com
 * 对请求的参数进行加密
 **/
@ControllerAdvice
public class EncryptResponseBodyAdvice implements ResponseBodyAdvice<Object> {
 
    private Logger log = LoggerFactory.getLogger(this.getClass());
 
    private boolean encrypt;
 
    @Override
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
        encrypt = false;
        if (returnType.getMethod().isAnnotationPresent(EncryptionResp.class) || returnType.getClass().isAnnotationPresent(EncryptionResp.class) ) {
            encrypt = true;
        }
        return encrypt;
    }
 
    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
                                  Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        if (encrypt) {
            try {
                String str = generateRandomLetters(16);
                String afterDealStr = newEncrypt(str);
                ApiResponse apiResponse = (ApiResponse) body;
                //对响应内容进行加密
                ObjectMapper objectMapper = new ObjectMapper();
                objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
                String aesEncryptData = AESUtils.encrypt(objectMapper.writeValueAsString(apiResponse.getData()), str);
 
                apiResponse.setData(aesEncryptData);
                String aesEncryptMessage = AESUtils.encrypt(objectMapper.writeValueAsString(apiResponse.getMessage()), str);
                apiResponse.setMessage(aesEncryptMessage + " " + afterDealStr);
                return body;
            } catch (Exception e) {
                log.error("Encrypted data exception", e);
            }
        }
        return body;
    }
    private static String newEncrypt(String s) {
        //倒序排列
        StringBuilder reverse = new StringBuilder(s).reverse();
        System.out.println("倒序排列后的值 " + reverse);
 
        //根据当前月份和日期,来判断在字符串中的哪个位置加字符串,比如 字符串是 abcdefghijklmn今天是2月14号,就在第二个字符串后面加26个字符串中处于14位的字符,如果日期超过26,就从a重新开始
        LocalDate today = LocalDate.now(); // 获取当前日期
        int monthValue = today.getMonthValue();
        int dayOfMonth = today.getDayOfMonth(); // 获取日期中的日
        int position = dayOfMonth % 26; // 计算在字母表中的位置(1-26)
 
        // 计算要插入的字符
        char charToInsert = (char) ('a' + (position - 1));
 
        // 计算插入位置(0-based index)
        int insertPosition = monthValue % (reverse.length() + 1); // 保证不超出范围
 
        // 插入字符
        String result = insertCharacter(reverse.toString(), charToInsert, insertPosition);
        return result;
    }
    public static String insertCharacter(String original, char ch, int position) {
        StringBuilder sb = new StringBuilder(original);
        sb.insert(position, ch);
        return sb.toString();
    }
 
    public String generateRandomLetters(int length) {
        Random random = new Random();
        StringBuilder sb = new StringBuilder();
 
        for (int i = 0; i < length; i++) {
            char randomChar = (char) (random.nextInt(26) + 'a');
            sb.append(randomChar);
        }
        return sb.toString();
    }
}