package org.dromara.cryptapi.filter; import cn.hutool.core.codec.Base64; import cn.hutool.core.io.IoUtil; import jakarta.servlet.ReadListener; import jakarta.servlet.ServletInputStream; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequestWrapper; import org.dromara.common.core.constant.Constants; import org.dromara.common.core.exception.base.BaseException; import org.dromara.common.core.utils.StringUtils; import org.dromara.cryptapi.core.AesEncryptor; import org.dromara.cryptapi.core.EncryptContext; import org.dromara.cryptapi.core.RsaEncryptor; import org.dromara.cryptapi.enums.EncodeType; import org.springframework.http.MediaType; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; /** * 解密请求参数工具类 * * @author wdhcr */ public class DecryptRequestBodyWrapper extends HttpServletRequestWrapper { private final byte[] body; public DecryptRequestBodyWrapper(HttpServletRequest request, RsaEncryptor rsaEncryptor, String headerFlag) throws IOException { super(request); String requestRsa = request.getHeader(headerFlag); if (StringUtils.isEmpty(requestRsa)) { throw new BaseException("加密AES的动态密码不能为空"); } String decryptAes = new String(Base64.decode(rsaEncryptor.decrypt(requestRsa))); request.setCharacterEncoding(Constants.UTF8); byte[] readBytes = IoUtil.readBytes(request.getInputStream(), false); String requestBody = StringUtils.toEncodedString(readBytes, StandardCharsets.UTF_8); EncryptContext encryptContext = new EncryptContext(); encryptContext.setPassword(decryptAes); encryptContext.setEncode(EncodeType.BASE64); AesEncryptor aesEncryptor = new AesEncryptor(encryptContext); String decryptBody = aesEncryptor.decrypt(requestBody); body = decryptBody.getBytes(StandardCharsets.UTF_8); } @Override public BufferedReader getReader() { return new BufferedReader(new InputStreamReader(getInputStream())); } @Override public int getContentLength() { return body.length; } @Override public long getContentLengthLong() { return body.length; } @Override public String getContentType() { return MediaType.APPLICATION_JSON_VALUE; } @Override public ServletInputStream getInputStream() { final ByteArrayInputStream bais = new ByteArrayInputStream(body); return new ServletInputStream() { @Override public int read() { return bais.read(); } @Override public int available() { return body.length; } @Override public boolean isFinished() { return false; } @Override public boolean isReady() { return false; } @Override public void setReadListener(ReadListener readListener) { } }; } }