fix 修复 响应加密编码错误问题

This commit is contained in:
疯狂的狮子Li
2026-06-30 16:50:59 +08:00
parent e571f339b4
commit 4e6dbee008
@@ -23,11 +23,11 @@ import java.util.Base64;
public class EncryptResponseBodyWrapper extends HttpServletResponseWrapper { public class EncryptResponseBodyWrapper extends HttpServletResponseWrapper {
private static final SecureRandom SECURE_RANDOM = new SecureRandom(); private static final SecureRandom SECURE_RANDOM = new SecureRandom();
private static final Charset RESPONSE_CHARSET = StandardCharsets.UTF_8;
private final ByteArrayOutputStream byteArrayOutputStream; private final ByteArrayOutputStream byteArrayOutputStream;
private final ServletOutputStream servletOutputStream; private final ServletOutputStream servletOutputStream;
private PrintWriter printWriter; private PrintWriter printWriter;
private Charset charset;
/** /**
* 构造加密响应包装器。 * 构造加密响应包装器。
@@ -39,7 +39,6 @@ public class EncryptResponseBodyWrapper extends HttpServletResponseWrapper {
super(response); super(response);
this.byteArrayOutputStream = new ByteArrayOutputStream(); this.byteArrayOutputStream = new ByteArrayOutputStream();
this.servletOutputStream = this.getOutputStream(); this.servletOutputStream = this.getOutputStream();
this.charset = resolveCharset(response);
} }
/** /**
@@ -50,8 +49,7 @@ public class EncryptResponseBodyWrapper extends HttpServletResponseWrapper {
@Override @Override
public PrintWriter getWriter() { public PrintWriter getWriter() {
if (printWriter == null) { if (printWriter == null) {
charset = resolveCharset((HttpServletResponse) getResponse()); printWriter = new PrintWriter(new OutputStreamWriter(byteArrayOutputStream, RESPONSE_CHARSET));
printWriter = new PrintWriter(new OutputStreamWriter(byteArrayOutputStream, charset));
} }
return printWriter; return printWriter;
} }
@@ -106,7 +104,7 @@ public class EncryptResponseBodyWrapper extends HttpServletResponseWrapper {
*/ */
public String getContent() throws IOException { public String getContent() throws IOException {
flushBuffer(); flushBuffer();
return byteArrayOutputStream.toString(charset); return byteArrayOutputStream.toString(RESPONSE_CHARSET);
} }
/** /**
@@ -130,14 +128,14 @@ public class EncryptResponseBodyWrapper extends HttpServletResponseWrapper {
// vue版本需要设置 // vue版本需要设置
servletResponse.addHeader("Access-Control-Expose-Headers", headerFlag); servletResponse.addHeader("Access-Control-Expose-Headers", headerFlag);
servletResponse.setHeader(headerFlag, encryptPassword); servletResponse.setHeader(headerFlag, encryptPassword);
servletResponse.setCharacterEncoding(charset.name()); servletResponse.setCharacterEncoding(RESPONSE_CHARSET.name());
// 获取原始内容 // 获取原始内容
String originalBody = this.getContent(); String originalBody = this.getContent();
// 对内容进行加密 // 对内容进行加密
String encryptContent = EncryptUtils.encryptByAes(originalBody, aesPassword); String encryptContent = EncryptUtils.encryptByAes(originalBody, aesPassword);
servletResponse.setContentLengthLong(encryptContent.getBytes(charset).length); servletResponse.setContentLengthLong(encryptContent.getBytes(RESPONSE_CHARSET).length);
return encryptContent; return encryptContent;
} }
@@ -206,20 +204,6 @@ public class EncryptResponseBodyWrapper extends HttpServletResponseWrapper {
}; };
} }
/**
* 解析响应字符集,未设置时默认使用 UTF-8。
*
* @param response 原始响应
* @return 响应字符集
*/
private Charset resolveCharset(HttpServletResponse response) {
String characterEncoding = response.getCharacterEncoding();
if (characterEncoding == null) {
return StandardCharsets.UTF_8;
}
return Charset.forName(characterEncoding);
}
/** /**
* 生成响应内容 AES 加密密钥。 * 生成响应内容 AES 加密密钥。
* *