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 { private Logger log = LoggerFactory.getLogger(this.getClass()); private boolean encrypt; @Override public boolean supports(MethodParameter returnType, Class> 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> 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(); } }