From 7fc73959ae24fd13594f921734f2cbea872e3174 Mon Sep 17 00:00:00 2001 From: ziin Date: Fri, 27 Feb 2026 16:04:43 +0800 Subject: [PATCH] =?UTF-8?q?fix(interceptor):=20=E4=BF=AE=E5=A4=8D=E5=A4=8D?= =?UTF-8?q?=E6=9D=82=E5=8F=82=E6=95=B0=E7=AD=BE=E5=90=8D=E5=BA=8F=E5=88=97?= =?UTF-8?q?=E5=8C=96=E9=A1=BA=E5=BA=8F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../keyborad/Interceptor/SignInterceptor.java | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/yolo/keyborad/Interceptor/SignInterceptor.java b/src/main/java/com/yolo/keyborad/Interceptor/SignInterceptor.java index e08c7b0..3660e0c 100644 --- a/src/main/java/com/yolo/keyborad/Interceptor/SignInterceptor.java +++ b/src/main/java/com/yolo/keyborad/Interceptor/SignInterceptor.java @@ -1,6 +1,7 @@ package com.yolo.keyborad.interceptor; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; import com.yolo.keyborad.utils.SignUtils; import jakarta.servlet.DispatcherType; import jakarta.servlet.http.HttpServletRequest; @@ -21,6 +22,8 @@ public class SignInterceptor implements HandlerInterceptor { // appId -> secret 的映射(可从 DB 等处加载) private final Map appSecretMap; private final ObjectMapper objectMapper = new ObjectMapper(); + private final ObjectMapper signValueObjectMapper = new ObjectMapper() + .configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true); private final StringRedisTemplate redisTemplate; // 允许时间误差 5 分钟 @@ -103,7 +106,7 @@ public class SignInterceptor implements HandlerInterceptor { Map bodyMap = objectMapper.readValue(body, Map.class); bodyMap.forEach((k, v) -> { if (v != null) { - params.put(k, String.valueOf(v)); + params.put(k, stringifyForSign(v)); } }); } @@ -118,6 +121,23 @@ public class SignInterceptor implements HandlerInterceptor { return true; } + private String stringifyForSign(Object value) { + if (value == null) { + return null; + } + if (value instanceof CharSequence || value instanceof Number || value instanceof Boolean) { + return String.valueOf(value); + } + if (value.getClass().isArray() || value instanceof Collection || value instanceof Map) { + try { + return signValueObjectMapper.writeValueAsString(value); + } catch (Exception e) { + throw new RuntimeException("Sign body param serialize error", e); + } + } + return String.valueOf(value); + } + private String buildNonceKey(String appId, String nonce) { // 可以按需加上前缀,便于区分业务 return "sign:nonce:" + appId + ":" + nonce;