liujie
2026-02-28 bd5a96d872a6e07694ee7035dc8e295e3d409ddf
Merge branch 'master' of http://120.76.84.145:10101/gitblit/r/java/Robotaxi

# Conflicts:
# xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/vehicleConvoy/XpVehicleAnnualRecord.java
3个文件已修改
35 ■■■■■ 已修改文件
xp-robotaxi-gateway-boot/src/main/java/com/xiaopeng/gateway/filter/SignFilter.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskController.java 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpInvitationCodeController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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);
    }
    /**
     * 校验签名
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskController.java
@@ -69,6 +69,7 @@
    @ApiOperation(value = "任务中心列表", response = TaskPageListVO.class, tags = "运维APP-任务中心")
    @PostMapping("/api/v1/task/pageList")
    public R<PageInfo<TaskPageListVO>> pageList(@RequestBody TaskPageListQuery query) {
        query.setUserId(tokenService.getLoginOperationUser().getXpOperationsUser().getId());
        PageInfo<TaskPageListVO> pageList = xpTaskService.pageList(query);
        return R.ok(pageList);
    }
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpInvitationCodeController.java
@@ -135,8 +135,11 @@
        }
    }
    @ApiOperation(value = "邀请码导入")
    @PostMapping("/base/v1/invitation/importExcel")
    @PostMapping("/api/v1/invitation/importExcel")
    public R<String> importExcel(@RequestPart("file") MultipartFile file) {
        System.out.println("文件名 = " + file.getOriginalFilename());
        System.out.println("文件大小 = " + file.getSize());
        System.out.println("ContentType = " + file.getContentType());
        ImportParams params = new ImportParams();
        params.setHeadRows(1); //表头行数
        InputStream inputStream = null;