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