From a07694e4d8d03077c719862b4249a119b0ee39d4 Mon Sep 17 00:00:00 2001
From: xuhy <3313886187@qq.com>
Date: 星期六, 28 二月 2026 21:37:03 +0800
Subject: [PATCH] 网关修改

---
 xp-robotaxi-gateway-boot/src/main/java/com/xiaopeng/gateway/filter/SignFilter.java |   29 ++++++++++++++++++++++++++++-
 1 files changed, 28 insertions(+), 1 deletions(-)

diff --git a/xp-robotaxi-gateway-boot/src/main/java/com/xiaopeng/gateway/filter/SignFilter.java b/xp-robotaxi-gateway-boot/src/main/java/com/xiaopeng/gateway/filter/SignFilter.java
index c3807e3..37c44eb 100644
--- a/xp-robotaxi-gateway-boot/src/main/java/com/xiaopeng/gateway/filter/SignFilter.java
+++ b/xp-robotaxi-gateway-boot/src/main/java/com/xiaopeng/gateway/filter/SignFilter.java
@@ -73,6 +73,12 @@
         if (StringUtils.matches(url, signProperties.getWhites())) {
             return chain.filter(exchange);
         }
+
+        // 判断是否为multipart请求
+        String contentType = request.getHeaders().getFirst("Content-Type");
+        boolean isMultipart = contentType != null && contentType.toLowerCase().contains("multipart/");
+
+
         //校验签名
         if(signProperties.getEnable()){
             String sign = request.getHeaders().getFirst(TokenConstants.SIGN);
@@ -93,7 +99,12 @@
             }
             //数据缓存保留24小时
             redisService.setCacheObject("sign:nonce:" + nonce, nonce, 24L, TimeUnit.DAYS);
-            return authSign(exchange, chain, sign, nonce, timestamp);
+            // 对于multipart请求,只校验headers,不读取body
+            if(isMultipart){
+                return authMultipartSign(exchange, chain, sign, nonce, timestamp);
+            } else {
+                return authSign(exchange, chain, sign, nonce, timestamp);
+            }
         }
         return chain.filter(exchange.mutate().request(mutate.build()).build());
     }
@@ -105,6 +116,22 @@
         return ServletUtils.webFluxResponseWriter(exchange.getResponse(), msg, HttpStatus.BAD_REQUEST);
     }
 
+    /**
+     * multipart请求的签名校验(不读取文件流)
+     * @return
+     */
+    private Mono<Void> authMultipartSign(ServerWebExchange exchange, GatewayFilterChain chain, String sign, String nonce, String timestamp){
+       // 对于multipart请求,只使用headers信息进行签名验证
+       // 构造基于headers的签名字符串
+        JSONObject headerParams = new JSONObject();
+        headerParams.put("content-type", exchange.getRequest().getHeaders().getFirst("Content-Type"));
+        headerParams.put("content-length", exchange.getRequest().getHeaders().getFirst("Content-Length"));
+        if(!authSign(headerParams, sign, nonce, timestamp)){
+            return unauthorizedResponse(exchange, "请求失败,请稍后重试!");
+        }
+        // 直接放行,不读取body
+        return chain.filter(exchange);
+    }
 
     /**
      * 校验签名

--
Gitblit v1.7.1