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