From 775fadea453c5a74b9e361205f9d04102add6551 Mon Sep 17 00:00:00 2001 From: tongtongstudio Date: Wed, 8 Jul 2026 10:35:48 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E7=A7=BB=E5=8A=A8?= =?UTF-8?q?=E7=AB=AF=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../filter/MobileApiSignatureFilter.java | 34 ++++++++++++------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/youlai/boot/framework/security/filter/MobileApiSignatureFilter.java b/src/main/java/com/youlai/boot/framework/security/filter/MobileApiSignatureFilter.java index 1a9d2d27..37ffc275 100644 --- a/src/main/java/com/youlai/boot/framework/security/filter/MobileApiSignatureFilter.java +++ b/src/main/java/com/youlai/boot/framework/security/filter/MobileApiSignatureFilter.java @@ -2,22 +2,22 @@ package com.youlai.boot.framework.security.filter; import cn.hutool.core.util.StrUtil; import cn.hutool.crypto.digest.DigestUtil; +import cn.hutool.json.JSONUtil; +import com.youlai.boot.common.result.Result; import com.youlai.boot.common.result.ResultCode; -import com.youlai.boot.common.result.ResponseWriter; import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; import org.springframework.web.filter.OncePerRequestFilter; import java.io.IOException; import java.nio.charset.StandardCharsets; -import java.util.Map; import java.util.SortedMap; import java.util.TreeMap; -import java.util.function.Consumer; -import java.util.function.Predicate; /** * 移动设备API签名验证过滤器 @@ -68,20 +68,20 @@ public class MobileApiSignatureFilter extends OncePerRequestFilter { // 1. 获取设备标识 String deviceId = request.getHeader(HEADER_DEVICE_ID); if (StrUtil.isBlank(deviceId)) { - ResponseWriter.writeSuccess(response, ResultCode.MOBILE_DEVICE_ID_REQUIRED); + writeErrorResponse(response, ResultCode.MOBILE_DEVICE_ID_REQUIRED); return; } // 获取随机数 String nonce = request.getHeader(HEADER_NONCE); if (StrUtil.isBlank(nonce)) { - ResponseWriter.writeSuccess(response, ResultCode.MOBILE_NONCE_REQUIRED); + writeErrorResponse(response, ResultCode.MOBILE_NONCE_REQUIRED); return; } // 2. 获取时间戳 String timestampStr = request.getHeader(HEADER_TIMESTAMP); if (StrUtil.isBlank(timestampStr)) { - ResponseWriter.writeSuccess(response, ResultCode.MOBILE_TIMESTAMP_REQUIRED); + writeErrorResponse(response, ResultCode.MOBILE_TIMESTAMP_REQUIRED); return; } @@ -89,28 +89,28 @@ public class MobileApiSignatureFilter extends OncePerRequestFilter { try { timestamp = Long.parseLong(timestampStr); } catch (NumberFormatException e) { - ResponseWriter.writeSuccess(response, ResultCode.MOBILE_TIMESTAMP_INVALID); + writeErrorResponse(response, ResultCode.MOBILE_TIMESTAMP_INVALID); return; } // 3. 验证时间戳是否在有效期内 long currentTime = System.currentTimeMillis(); if (Math.abs(currentTime - timestamp) > SIGN_VALID_DURATION) { - ResponseWriter.writeSuccess(response, ResultCode.MOBILE_TIMESTAMP_EXPIRED); + writeErrorResponse(response, ResultCode.MOBILE_TIMESTAMP_EXPIRED); return; } // 4. 获取签名 String sign = request.getHeader(HEADER_SIGN); if (StrUtil.isBlank(sign)) { - ResponseWriter.writeSuccess(response, ResultCode.MOBILE_SIGN_REQUIRED); + writeErrorResponse(response, ResultCode.MOBILE_SIGN_REQUIRED); return; } // 5. 获取设备密钥(从Redis或数据库) // String deviceSecret = getDeviceSecret(deviceId); // if (StrUtil.isBlank(deviceSecret)) { -// ResponseWriter.writeSuccess(response, ResultCode.MOBILE_DEVICE_NOT_REGISTERED); +// writeErrorResponse(response, ResultCode.MOBILE_DEVICE_NOT_REGISTERED); // return; // } @@ -118,7 +118,7 @@ public class MobileApiSignatureFilter extends OncePerRequestFilter { String expectedSign = generateSign(request); logger.info("Expected sign: " + expectedSign); if (!sign.equals(expectedSign)) { - ResponseWriter.writeSuccess(response, ResultCode.MOBILE_SIGN_INVALID); + writeErrorResponse(response, ResultCode.MOBILE_SIGN_INVALID); return; } @@ -184,4 +184,12 @@ public class MobileApiSignatureFilter extends OncePerRequestFilter { // 3. 生成MD5签名 return DigestUtil.sha256Hex(sb.toString()); } -} + + private void writeErrorResponse(HttpServletResponse response, ResultCode resultCode) throws IOException { + response.setStatus(HttpStatus.BAD_REQUEST.value()); + response.setCharacterEncoding(StandardCharsets.UTF_8.name()); + response.setContentType(MediaType.APPLICATION_JSON_VALUE); + Result result = Result.failed(resultCode); + response.getWriter().write(JSONUtil.toJsonStr(result)); + } +} \ No newline at end of file