From 6255d65e21f2ef36478948afb360acc5e8b29215 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Thu, 1 Oct 2026 02:06:34 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20HCS=E8=AE=A4=E8=AF=81=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=E5=9B=BA=E5=AE=9AAuthorization+Key-Auth=E9=9D=99=E6=80=81?= =?UTF-8?q?=E5=8F=8C=E8=AF=B7=E6=B1=82=E5=A4=B4=EF=BC=88v4=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E8=AF=B4=E6=98=8E=E5=8F=98=E6=9B=B4=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 所有接口由拦截器统一注入 Authorization(整值可配)+ Key-Auth,不再调用getToken取令牌 - 删除 oauth2/getToken 与 basic 双模式、HcsTokenService/HcsTokenVO 及 Redis 令牌缓存、blade-starter-redis 依赖 - 新配置项 third-party.hcs.authorization / key-auth,未配置时告警放行(对端401暴露配置缺失) - 各接口路径维持 thirdParty.hcs.*Url 覆盖机制,网关前缀拼在 base-url(如 /gwzh/HTHG) --- blade-third-party-api/blade-hcs-api/pom.xml | 4 - .../hcs/config/HcsFeignClientConfig.java | 9 +- .../springblade/hcs/config/HcsProperties.java | 24 +-- .../springblade/hcs/constant/HcsConstant.java | 36 +---- .../org/springblade/hcs/dto/HcsTokenVO.java | 63 -------- .../org/springblade/hcs/feign/IHcsClient.java | 19 +-- .../hcs/interceptor/HcsAuthInterceptor.java | 65 +++----- .../hcs/token/HcsTokenService.java | 140 ------------------ 8 files changed, 36 insertions(+), 324 deletions(-) delete mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsTokenVO.java delete mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/token/HcsTokenService.java diff --git a/blade-third-party-api/blade-hcs-api/pom.xml b/blade-third-party-api/blade-hcs-api/pom.xml index f5885238..148cb2c2 100644 --- a/blade-third-party-api/blade-hcs-api/pom.xml +++ b/blade-third-party-api/blade-hcs-api/pom.xml @@ -15,10 +15,6 @@ BladeX 合同合规系统(HCS)API 契约模块 - - org.springblade - blade-starter-redis - org.springframework.boot spring-boot-starter-test diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsFeignClientConfig.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsFeignClientConfig.java index bf241369..9c893d56 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsFeignClientConfig.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsFeignClientConfig.java @@ -28,8 +28,6 @@ package org.springblade.hcs.config; import feign.Request; import feign.RequestInterceptor; import org.springblade.hcs.interceptor.HcsAuthInterceptor; -import org.springblade.hcs.token.HcsTokenService; -import org.springframework.beans.factory.ObjectProvider; import org.springframework.context.annotation.Bean; import java.util.concurrent.TimeUnit; @@ -52,12 +50,11 @@ public class HcsFeignClientConfig { } /** - * HCS 认证拦截器。以 ObjectProvider 惰性持有令牌服务, - * 避免 Feign 客户端构建(需拦截器)与令牌服务(依赖 Feign 客户端取令牌)之间的构造期循环依赖 + * HCS 认证拦截器:所有请求注入 Authorization + Key-Auth 两个静态认证头(v4 接口说明) */ @Bean - public RequestInterceptor hcsAuthInterceptor(HcsProperties properties, ObjectProvider tokenServiceProvider) { - return new HcsAuthInterceptor(properties, tokenServiceProvider); + public RequestInterceptor hcsAuthInterceptor(HcsProperties properties) { + return new HcsAuthInterceptor(properties); } @Bean diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java index 3963b0d8..8f490dde 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java @@ -26,7 +26,6 @@ package org.springblade.hcs.config; import lombok.Data; -import org.springblade.hcs.constant.HcsConstant; import org.springframework.boot.context.properties.ConfigurationProperties; import java.util.HashMap; @@ -45,29 +44,18 @@ import java.util.Map; @ConfigurationProperties(prefix = "third-party.hcs") public class HcsProperties { /** - * 合同合规系统(HCS)接口基础地址,直连可配(网关/iPaaS 部署时改此处,代码不感知) + * 合同合规系统(HCS)接口基础地址,直连可配(网关/iPaaS 部署时改此处,代码不感知)。 + * v4 接口说明:地址带网关前缀,如 http://172.16.203.134:8000/gwzh/HTHG */ private String baseUrl; /** - * 认证方式:oauth2(默认,URL 追加 access_token)| basic(Authorization 请求头),切换不改代码 + * Authorization 请求头整值(含 Basic 前缀,如 Basic d2Njazp...,凭据走 Nacos + 环境变量注入) */ - private String authType = HcsConstant.AUTH_TYPE_OAUTH2; + private String authorization; /** - * OAuth2 应用 appKey + * Key-Auth 请求头值(v4 接口说明:所有接口固定携带 Authorization + Key-Auth 两个头) */ - private String appKey; - /** - * OAuth2 应用 appSecret - */ - private String appSecret; - /** - * Basic 认证用户名 - */ - private String basicUsername; - /** - * Basic 认证密码 - */ - private String basicPassword; + private String keyAuth; /** * 来源系统标识(fd_sources,D14 约定值 TMS) */ diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/constant/HcsConstant.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/constant/HcsConstant.java index a8fd786c..d41d18af 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/constant/HcsConstant.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/constant/HcsConstant.java @@ -38,42 +38,12 @@ public class HcsConstant { public static final String SUCCESS_CODE = "return.optSuccess"; /** - * 认证方式:OAuth2(默认,URL 追加 access_token) - */ - public static final String AUTH_TYPE_OAUTH2 = "oauth2"; - - /** - * 认证方式:Basic(Authorization 请求头) - */ - public static final String AUTH_TYPE_BASIC = "basic"; - - /** - * 网关认证请求头名称 + * 网关认证请求头名称(整值可配,如 Basic d2Njazp...) */ public static final String HEADER_AUTHORIZATION = "Authorization"; /** - * Basic 认证请求头前缀 + * 网关 Key-Auth 认证请求头名称(v4 接口说明:所有接口固定携带) */ - public static final String HEADER_BASIC_PREFIX = "Basic "; - - /** - * OAuth2 access_token 追加到业务请求 URL 的参数名 - */ - public static final String QUERY_ACCESS_TOKEN = "access_token"; - - /** - * HCS access_token 缓存 key(照 BFI 令牌缓存命名惯例) - */ - public static final String HCS_TOKEN_CACHE_KEY = "blade:third:hcs:token"; - - /** - * token 提前失效缓冲时长(毫秒),防止刚好过期(照 BFI 120s 缓冲) - */ - public static final long TOKEN_EXPIRE_BUFFER_MILLIS = 120_000L; - - /** - * getToken 接口默认路径片段,拦截器据此跳过令牌追加(避免给取令牌请求再带 access_token) - */ - public static final String GET_TOKEN_PATH = "/authapi/getToken"; + public static final String HEADER_KEY_AUTH = "Key-Auth"; } diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsTokenVO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsTokenVO.java deleted file mode 100644 index 211bd6df..00000000 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsTokenVO.java +++ /dev/null @@ -1,63 +0,0 @@ -/** - * BladeX Commercial License Agreement - * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. - *

- * Use of this software is governed by the Commercial License Agreement - * obtained after purchasing a license from BladeX. - *

- * 1. This software is for development use only under a valid license - * from BladeX. - *

- * 2. Redistribution of this software's source code to any third party - * without a commercial license is strictly prohibited. - *

- * 3. Licensees may copyright their own code but cannot use segments - * from this software for such purposes. Copyright of this software - * remains with BladeX. - *

- * Using this software signifies agreement to this License, and the software - * must not be used for illegal purposes. - *

- * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is - * not liable for any claims arising from secondary or illegal development. - *

- * Author: Chill Zhuang (bladejava@qq.com) - */ -package org.springblade.hcs.dto; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; - -/** - * 合同合规系统(HCS)OAuth2 取令牌返回结果(GET /authapi/getToken) - *

- * TODO 待联调确认:v4 文档未给出本接口响应字段示例,字段名按通用 OAuth2 惯例预置, - * 联调时以实际返回为准(设计文档 §3.2)。 - * - * @author Chill - */ -@Data -@JsonIgnoreProperties(ignoreUnknown = true) -public class HcsTokenVO implements Serializable { - @Serial - private static final long serialVersionUID = 1L; - /** - * 访问令牌,调用业务接口时追加到 URL 参数 access_token - */ - @JsonProperty("access_token") - private String accessToken; - /** - * 令牌类型 - */ - @JsonProperty("token_type") - private String tokenType; - /** - * 令牌有效期(毫秒) - */ - @JsonProperty("expires_in") - private Long expiresIn; -} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/feign/IHcsClient.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/feign/IHcsClient.java index 7b4a0eb7..cff70f6a 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/feign/IHcsClient.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/feign/IHcsClient.java @@ -56,10 +56,8 @@ import org.springblade.hcs.dto.HcsRiskQueryDTO; import org.springblade.hcs.dto.HcsRiskVO; import org.springblade.hcs.dto.HcsSpecPaySaveDTO; import org.springblade.hcs.dto.HcsTemplateVO; -import org.springblade.hcs.dto.HcsTokenVO; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; @@ -67,7 +65,11 @@ import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.multipart.MultipartFile; /** - * 合同合规系统(HCS)接口(一期 24 个业务接口 + OAuth2 取令牌,D4) + * 合同合规系统(HCS)接口(一期 24 个业务接口,D4) + *

+ * v4 接口说明:认证统一由 {@link org.springblade.hcs.interceptor.HcsAuthInterceptor} 注入 + * Authorization + Key-Auth 两个静态请求头,不再调用 getToken 取令牌; + * 各接口路径可用 thirdParty.hcs.*Url 配置覆盖(默认值即 v4 文档路径)。 *

* 除附件上传(multipart/form-data)、附件下载(文件流)外均为 POST + application/json(UTF-8)。 * 业务成败以统一出参 {@link HcsResult#isSuccess()} 为准; @@ -78,7 +80,6 @@ import org.springframework.web.multipart.MultipartFile; @FeignClient(name = "HCS", url = "${thirdParty.hcs.baseUrl}", configuration = HcsFeignClientConfig.class) public interface IHcsClient { - String GET_TOKEN_URL = "${thirdParty.hcs.getTokenUrl:/authapi/getToken}"; String PROJECT_ADD_URL = "${thirdParty.hcs.projectAddUrl:/openapi/sys-modeling/apis/data/km-project1/V1/projectApproval/add}"; String PROJECT_UPDATE_URL = "${thirdParty.hcs.projectUpdateUrl:/openapi/sys-modeling/apis/data/km-project1/V1/projectApproval/update}"; String PROJECT_LIST_URL = "${thirdParty.hcs.projectListUrl:/openapi/sys-modeling/apis/data/km-project1/V1/projectApproval/list}"; @@ -104,16 +105,6 @@ public interface IHcsClient { String INVOICE_REG_ADD_URL = "${thirdParty.hcs.invoiceRegAddUrl:/openapi/eop-data/eopDataInvoiceRegistrationOpen/add}"; String INVOICE_REG_UPDATE_URL = "${thirdParty.hcs.invoiceRegUpdateUrl:/openapi/eop-data/eopDataInvoiceRegistrationOpen/update}"; - /** - * OAuth2 获取令牌(appKey/appSecret 走 URL 参数,D2) - * - * @param appKey 应用 appKey - * @param appSecret 应用 appSecret - * @return 令牌信息 - */ - @GetMapping(GET_TOKEN_URL) - HcsResult getToken(@RequestParam("appKey") String appKey, @RequestParam("appSecret") String appSecret); - /** * C102-1 项目立项新建 * diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/interceptor/HcsAuthInterceptor.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/interceptor/HcsAuthInterceptor.java index ade05035..62499242 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/interceptor/HcsAuthInterceptor.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/interceptor/HcsAuthInterceptor.java @@ -29,22 +29,18 @@ import feign.RequestInterceptor; import feign.RequestTemplate; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springblade.core.tool.utils.StringUtil; import org.springblade.hcs.config.HcsProperties; import org.springblade.hcs.constant.HcsConstant; -import org.springblade.hcs.token.HcsTokenService; -import org.springframework.beans.factory.ObjectProvider; - -import java.nio.charset.StandardCharsets; -import java.util.Base64; /** - * 合同合规系统(HCS)请求拦截器,按配置的认证方式注入凭据(D2,两种实现并存、切换不改代码) + * 合同合规系统(HCS)请求拦截器(v4 接口说明,D2) + *

+ * 所有业务接口统一注入两个静态认证头,不再走 getToken/令牌缓存: *

    - *
  • oauth2(默认):GET /authapi/getToken 取令牌后,把 access_token 追加到业务请求 URL;
  • - *
  • basic:注入 Authorization: Basic base64(user:password) 请求头。
  • + *
  • Authorization:整值可配(如 Basic d2Njazp...,含前缀);
  • + *
  • Key-Auth:网关密钥,整值可配。
  • *
- * 取令牌请求本身不追加 access_token(路径守卫 + 空令牌守卫双重防护)。 + * 两个头均来自 Nacos + 环境变量注入,未配置时告警并放行(由对端返回 401 暴露问题)。 * * @author Chill */ @@ -54,46 +50,23 @@ public class HcsAuthInterceptor implements RequestInterceptor { private final HcsProperties properties; - /** - * 惰性持有令牌服务,打破 Feign 客户端与令牌服务的构造期循环依赖 - */ - private final ObjectProvider tokenServiceProvider; - @Override public void apply(RequestTemplate template) { - if (HcsConstant.AUTH_TYPE_BASIC.equals(properties.getAuthType())) { - applyBasicAuth(template); - return; + String authorization = properties.getAuthorization(); + if (isBlank(authorization)) { + log.warn("HCS Authorization 请求头未配置(thirdParty.hcs.authorization),请求 {} 将无认证头", template.path()); + } else { + template.header(HcsConstant.HEADER_AUTHORIZATION, authorization); + } + String keyAuth = properties.getKeyAuth(); + if (isBlank(keyAuth)) { + log.warn("HCS Key-Auth 请求头未配置(thirdParty.hcs.key-auth),请求 {} 将无认证头", template.path()); + } else { + template.header(HcsConstant.HEADER_KEY_AUTH, keyAuth); } - applyOAuth2Token(template); } - /** - * Basic 认证:注入 Authorization 请求头(凭据走 Nacos + 环境变量注入) - */ - private void applyBasicAuth(RequestTemplate template) { - if (StringUtil.isBlank(properties.getBasicUsername()) || StringUtil.isBlank(properties.getBasicPassword())) { - log.warn("HCS Basic 认证凭据未配置(thirdParty.hcs.basic-username/basic-password),请求 {} 将无认证头", template.path()); - return; - } - String credentials = properties.getBasicUsername() + ":" + properties.getBasicPassword(); - String encoded = Base64.getEncoder().encodeToString(credentials.getBytes(StandardCharsets.UTF_8)); - template.header(HcsConstant.HEADER_AUTHORIZATION, HcsConstant.HEADER_BASIC_PREFIX + encoded); - } - - /** - * OAuth2 认证:业务请求 URL 追加 access_token 参数 - */ - private void applyOAuth2Token(RequestTemplate template) { - // 取令牌请求本身不再追加 access_token - if (template.path() != null && template.path().contains(HcsConstant.GET_TOKEN_PATH)) { - return; - } - String accessToken = tokenServiceProvider.getObject().getAccessToken(); - if (StringUtil.isBlank(accessToken)) { - log.warn("HCS access_token 为空,请求 {} 未追加令牌参数", template.path()); - return; - } - template.query(HcsConstant.QUERY_ACCESS_TOKEN, accessToken); + private boolean isBlank(String value) { + return value == null || value.trim().isEmpty(); } } diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/token/HcsTokenService.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/token/HcsTokenService.java deleted file mode 100644 index fddfca29..00000000 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/token/HcsTokenService.java +++ /dev/null @@ -1,140 +0,0 @@ -/** - * BladeX Commercial License Agreement - * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. - *

- * Use of this software is governed by the Commercial License Agreement - * obtained after purchasing a license from BladeX. - *

- * 1. This software is for development use only under a valid license - * from BladeX. - *

- * 2. Redistribution of this software's source code to any third party - * without a commercial license is strictly prohibited. - *

- * 3. Licensees may copyright their own code but cannot use segments - * from this software for such purposes. Copyright of this software - * remains with BladeX. - *

- * Using this software signifies agreement to this License, and the software - * must not be used for illegal purposes. - *

- * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is - * not liable for any claims arising from secondary or illegal development. - *

- * Author: Chill Zhuang (bladejava@qq.com) - */ -package org.springblade.hcs.token; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springblade.core.redis.cache.BladeRedis; -import org.springblade.core.tool.utils.StringUtil; -import org.springblade.hcs.config.HcsProperties; -import org.springblade.hcs.constant.HcsConstant; -import org.springblade.hcs.dto.HcsResult; -import org.springblade.hcs.dto.HcsTokenVO; -import org.springblade.hcs.exception.HcsException; -import org.springblade.hcs.feign.IHcsClient; -import org.springframework.stereotype.Service; - -import java.time.Duration; -import java.util.Objects; - -/** - * 合同合规系统(HCS)OAuth2 令牌服务(D2,照 BfiServiceImpl 惯例) - *

- * GET /authapi/getToken(appKey/appSecret)→ access_token 存 Redis - * (key {@link HcsConstant#HCS_TOKEN_CACHE_KEY},过期前留 120s 缓冲)。 - * 业务调用统一经 {@link #getAccessToken()} 取缓存令牌; - * 401 时调用 {@link #refreshAccessToken()} 强制刷新一次后重放(D7,重试职责归扫描任务,此处仅刷新令牌)。 - * auth-type=basic 时不走本服务,由拦截器注入 Basic 认证头。 - * - * @author Chill - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class HcsTokenService { - - private final HcsProperties properties; - private final IHcsClient client; - private final BladeRedis bladeRedis; - - /** - * 获取访问令牌:Redis 命中直接返回,未命中远端取令牌并缓存 - * - * @return access_token - */ - public String getAccessToken() { - String token = bladeRedis.get(HcsConstant.HCS_TOKEN_CACHE_KEY); - if (StringUtil.isNotBlank(token)) { - return token; - } - return requestToken(); - } - - /** - * 强制刷新访问令牌(401 时调用一次并重放请求) - * - * @return 新 access_token - */ - public String refreshAccessToken() { - log.info("强制刷新HCS令牌,清除本地缓存"); - bladeRedis.del(HcsConstant.HCS_TOKEN_CACHE_KEY); - return requestToken(); - } - - /** - * 远端取令牌并缓存 - * - * @return access_token - */ - private String requestToken() { - if (StringUtil.isBlank(properties.getAppKey()) || StringUtil.isBlank(properties.getAppSecret())) { - throw new HcsException("获取HCS令牌失败,appKey/appSecret 未配置(thirdParty.hcs.app-key/app-secret)"); - } - long start = System.currentTimeMillis(); - log.info("调用HCS接口 获取令牌开始"); - HcsResult result = client.getToken(properties.getAppKey(), properties.getAppSecret()); - log.info("调用HCS接口 获取令牌结束 耗时:{}ms,success:{}", System.currentTimeMillis() - start, result.isSuccess()); - if (result == null || !result.isSuccess()) { - log.error("调用HCS接口 获取令牌失败响应:{}", result == null ? "无响应" : String.format("code=%s, msg=%s, traceId=%s", - result.getCode(), result.getMsg(), result.getTraceId())); - throw new HcsException("调用HCS接口获取令牌异常 " + (result == null ? "响应为空" : result.getMsg())); - } - HcsTokenVO tokenVO = result.getData(); - if (tokenVO == null || StringUtil.isBlank(tokenVO.getAccessToken())) { - log.error("调用HCS接口 获取令牌返回数据为空"); - throw new HcsException("调用HCS接口获取令牌异常,返回数据为空"); - } - cacheToken(tokenVO); - return tokenVO.getAccessToken(); - } - - /** - * 缓存令牌,按 expires_in 毫秒数设置提前失效时间 - *

- * TODO 待联调确认:v4 未给出 getToken 响应字段示例,expires_in 字段名与单位以实际返回为准(设计文档 §3.2) - * - * @param tokenVO 令牌信息 - */ - private void cacheToken(HcsTokenVO tokenVO) { - if (tokenVO.getExpiresIn() == null || tokenVO.getExpiresIn() <= HcsConstant.TOKEN_EXPIRE_BUFFER_MILLIS) { - log.warn("HCS令牌未返回有效期或有效期不足缓冲时长,本次不缓存"); - return; - } - // 过期时间 - 缓冲时长,防止刚好过期 - long expireMillis = tokenVO.getExpiresIn() - HcsConstant.TOKEN_EXPIRE_BUFFER_MILLIS; - bladeRedis.getValueOps().setIfAbsent(HcsConstant.HCS_TOKEN_CACHE_KEY, tokenVO.getAccessToken(), Duration.ofMillis(expireMillis)); - log.info("HCS令牌已缓存,有效期 {}ms(含 {}ms 提前失效缓冲)", expireMillis, HcsConstant.TOKEN_EXPIRE_BUFFER_MILLIS); - } - - /** - * 令牌缓存是否命中(诊断用) - * - * @return true-缓存存在 - */ - public boolean isTokenCached() { - return StringUtil.isNotBlank(Objects.toString(bladeRedis.get(HcsConstant.HCS_TOKEN_CACHE_KEY), null)); - } -}