RuoYi-Vue-Plus/ruoyi-common/src/main/java/com/ruoyi/common/advice/EncodeResponseBodyAdvice.java
2023-08-22 18:07:59 +08:00

77 lines
2.9 KiB
Java

package com.ruoyi.common.advice;
import cn.hutool.core.util.ObjectUtil;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.domain.RsaSecurity;
import com.ruoyi.common.core.service.IRsaSecurityService2;
import com.ruoyi.common.utils.JsonUtils;
import com.ruoyi.common.utils.RSAUtil;
import com.ruoyi.common.utils.spring.SpringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
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;
/**
* @author monkey
* @desc 返回数据加密
* @date 2018/10/25 20:17
*/
@ControllerAdvice
public class EncodeResponseBodyAdvice implements ResponseBodyAdvice {
private final static Logger logger = LoggerFactory.getLogger(EncodeResponseBodyAdvice.class);
private static final IRsaSecurityService2 rsaSecurityService2=SpringUtils.getBean(IRsaSecurityService2.class);
@Override
public boolean supports(MethodParameter methodParameter, Class aClass) {
return true;
}
@Override
public Object beforeBodyWrite(Object body, MethodParameter methodParameter, MediaType mediaType, Class aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
// 此处要用反射将字段中的注解解析出来
String method = serverHttpRequest.getMethod().name();
String path = serverHttpRequest.getURI().getPath();
RsaSecurity info = rsaSecurityService2.getInfo(path,method);
if (ObjectUtil.isNotNull(info)) {
if ("1".equals(info.getRestricted())){
return R.fail("接口已限制请求");
}
if ("1".equals(info.getOutEncode())) {
serverHttpResponse.getHeaders().add("isRsaencrypt","true");
return encodeRsa(methodParameter, body, info.getPublicKey());
}
}
serverHttpResponse.getHeaders().add("isRsaencrypt","false");
return body;
}
/**
* RSA私钥加密
*
* @param methodParameter
* @param body
* @return
*/
private Object encodeRsa(MethodParameter methodParameter, Object body,String outPublicKey) {
try {
String result = JsonUtils.toJsonString(body);
logger.info("对返回数据 :【" + result + "】进行加密");
String s = RSAUtil.publicKeyEncryptBase64(result,outPublicKey);
logger.info("加密之后密文:"+s);
return s;
} catch (Exception e) {
e.printStackTrace();
logger.error("对方法method :【" + methodParameter.getMethod().getName() + "】返回数据进行加密出现异常:" + e.getMessage());
}
return body;
}
}