| 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(); | 
|     } | 
| } |