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