From 0220811fbcffd4bd4df334502a2af272ae29f1e3 Mon Sep 17 00:00:00 2001
From: wenminjie <1036699586@qq.com>
Date: 星期一, 13 七月 2026 10:14:30 +0800
Subject: [PATCH] 修复了已知BUG
---
ruoyi-common/src/main/java/com/ruoyi/common/filter/SmCryptoFilter.java | 28 ++++++++++++++++++++++------
1 files changed, 22 insertions(+), 6 deletions(-)
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/filter/SmCryptoFilter.java b/ruoyi-common/src/main/java/com/ruoyi/common/filter/SmCryptoFilter.java
index fc9814b..4cc25e7 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/filter/SmCryptoFilter.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/filter/SmCryptoFilter.java
@@ -12,6 +12,7 @@
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
+import java.nio.charset.StandardCharsets;
import java.rmi.ServerException;
public class SmCryptoFilter implements Filter {
@@ -24,8 +25,14 @@
HttpServletResponse httpResponse = (HttpServletResponse) response;
try {
+ // 设置请求和响应的编码为 UTF-8
+ request.setCharacterEncoding("UTF-8");
+ response.setCharacterEncoding("UTF-8");
+ response.setContentType("application/json;charset=UTF-8");
+
// 对请求进行解密
String decryptedRequestBody = decryptRequest(httpRequest);
+ logger.info("解密后数据={}", decryptedRequestBody);
// 处理解密后的请求体 CustomRequestWrapper为自定义请求包装器,请看下面实现
CustomRequestWrapper customRequestWrapper = new CustomRequestWrapper(httpRequest, decryptedRequestBody);
@@ -35,7 +42,7 @@
// 获取并加密响应内容
byte[] content = responseWrapper.getContentAsByteArray();
- String originalResponseBody = new String(content);
+ String originalResponseBody = new String(content, StandardCharsets.UTF_8); // 关键修改
String encryptedResponseBody = encryptResponse(originalResponseBody);
responseWrapper.setContentType("application/json");
@@ -67,16 +74,25 @@
* @throws IOException 如果读取或解密过程中发生错误
*/
private String decryptRequest(HttpServletRequest request) throws IOException {
+ // 先设置编码
+ request.setCharacterEncoding("UTF-8");
+
+ // 使用Reader读取,但确保使用了正确的编码
StringBuilder jb = new StringBuilder();
String line;
- BufferedReader reader = request.getReader();
- while ((line = reader.readLine()) != null) {
- jb.append(line);
+ // 直接使用getReader(),此时应该使用UTF-8
+ try (BufferedReader reader = request.getReader()) {
+ while ((line = reader.readLine()) != null) {
+ jb.append(line);
+ }
}
+
+ String requestBody = jb.toString();
try {
- return Sm4Utils.sm4DecryptUtil(jb.toString());
+ return Sm4Utils.sm4DecryptUtil(requestBody);
} catch (Exception e) {
- throw new ServerException("参数解密失败:{}", e);
+ logger.error("参数解密失败,原始数据:{}", requestBody);
+ throw new ServerException("参数解密失败", e);
}
}
--
Gitblit v1.7.1