package com.doumee.config.interfaceencryption; 
 | 
  
 | 
import com.alibaba.fastjson.JSONObject; 
 | 
import com.doumee.config.annotation.EncryptionReq; 
 | 
import com.doumee.config.annotation.EncryptionResp; 
 | 
import com.doumee.config.interfaceencryption.tool.RSAEncrypt; 
 | 
import com.doumee.core.utils.AESUtils; 
 | 
import org.slf4j.Logger; 
 | 
import org.slf4j.LoggerFactory; 
 | 
import org.springframework.beans.factory.annotation.Autowired; 
 | 
import org.springframework.core.MethodParameter; 
 | 
import org.springframework.http.HttpHeaders; 
 | 
import org.springframework.http.HttpInputMessage; 
 | 
import org.springframework.http.converter.HttpMessageConverter; 
 | 
import org.springframework.util.StreamUtils; 
 | 
import org.springframework.web.bind.annotation.ControllerAdvice; 
 | 
import org.springframework.web.servlet.mvc.method.annotation.RequestBodyAdvice; 
 | 
  
 | 
import java.io.ByteArrayInputStream; 
 | 
import java.io.IOException; 
 | 
import java.io.InputStream; 
 | 
import java.lang.reflect.Type; 
 | 
import java.util.Base64; 
 | 
  
 | 
/** 
 | 
 * 【问题】群组表 
 | 
 * github地址 http://www.github.com/wanyushu 
 | 
 * gitee地址 http://www.gitee.com/wanyushu 
 | 
 * @author yushu 
 | 
 * @email 921784721@qq.com 
 | 
 * 对请求的参数进行解密 
 | 
 **/ 
 | 
@ControllerAdvice 
 | 
public class DecryptRequestBodyAdvice implements RequestBodyAdvice { 
 | 
  
 | 
    private Logger log = LoggerFactory.getLogger(this.getClass()); 
 | 
  
 | 
    private boolean encrypt; 
 | 
  
 | 
    @Override 
 | 
    public boolean supports(MethodParameter methodParameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) { 
 | 
        if (methodParameter.getMethod().isAnnotationPresent(EncryptionReq.class) || methodParameter.getClass().isAnnotationPresent(EncryptionReq.class)  ) { 
 | 
            encrypt = true; 
 | 
        }else{ 
 | 
            encrypt=false; 
 | 
        } 
 | 
        return encrypt; 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public Object handleEmptyBody(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) { 
 | 
        return body; 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public HttpInputMessage beforeBodyRead(HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, 
 | 
                                           Class<? extends HttpMessageConverter<?>> converterType){ 
 | 
        if (encrypt) { 
 | 
            try { 
 | 
                byte[] payload = StreamUtils.copyToByteArray(inputMessage.getBody()); 
 | 
                String content =new String(payload); 
 | 
                JSONObject jsonObject = JSONObject.parseObject(content); 
 | 
                if(jsonObject.get("data")!=null){ 
 | 
                    content = jsonObject.getString("data"); 
 | 
                } 
 | 
                // 读取完整的客户端请求体,也就是加密/编码后的数据 
 | 
                String key  = jsonObject.getString("ivKey"); 
 | 
                log.info("加密 key:{}", key); 
 | 
                String decrypt = RSAEncrypt.decrypt(key, RSAEncrypt.privateKey); 
 | 
  
 | 
                log.info("加密 Payload:{}",content); 
 | 
                String decrypt1 = AESUtils.decrypt(content, decrypt); 
 | 
                // 解码为原始数据 
 | 
                byte[] rawPayload =  decrypt1.getBytes(); 
 | 
                log.info("原始 Payload:{}", decrypt); 
 | 
                // 返回 HttpInputMessage 匿名对象 
 | 
                return new HttpInputMessage() { 
 | 
                    @Override 
 | 
                    public HttpHeaders getHeaders() { 
 | 
//                        inputMessage.getHeaders().set("Content-Type","application/json;charset=UTF-8"); 
 | 
                        return inputMessage.getHeaders(); 
 | 
                    } 
 | 
                    @Override 
 | 
                    public InputStream getBody() throws IOException { 
 | 
                        // 使用原始数据构建为 ByteArrayInputStream 
 | 
                        return new ByteArrayInputStream(rawPayload); 
 | 
                    } 
 | 
                }; 
 | 
            } catch (Exception e) { 
 | 
                log.error("Decryption failed", e); 
 | 
            } 
 | 
        } 
 | 
        return inputMessage; 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public Object afterBodyRead(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, 
 | 
                                Class<? extends HttpMessageConverter<?>> converterType) { 
 | 
        return body; 
 | 
    } 
 | 
} 
 |