From 8d13978e848c10d93d012263da2904e0d8badac8 Mon Sep 17 00:00:00 2001 From: b2894lxlx <517289602@qq.com> Date: Fri, 18 Sep 2026 19:48:16 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E4=BF=AE=E5=A4=8D=E5=B0=8F=E7=A8=8B?= =?UTF-8?q?=E5=BA=8F=E6=89=8B=E6=9C=BA=E5=8F=B7=E7=99=BB=E5=BD=95=E9=97=AE?= =?UTF-8?q?=E9=A2=98=202=E3=80=81=E8=B0=83=E6=95=B4OA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/controller/UserController.java | 2 +- .../service/impl/OASyncServiceImpl.java | 4 +- .../oa/config/OAFeignClientConfig.java | 23 +++++- .../oa/interceptor/OARequestInterceptor.java | 73 ++++++++++--------- 4 files changed, 63 insertions(+), 39 deletions(-) diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/controller/UserController.java b/blade-service/blade-system/src/main/java/org/springblade/system/controller/UserController.java index 36c7f7d..ab5e782 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/controller/UserController.java +++ b/blade-service/blade-system/src/main/java/org/springblade/system/controller/UserController.java @@ -169,7 +169,7 @@ public class UserController { @Operation(summary = "同步OA人员") public R syncIamAccounts( @RequestParam(defaultValue = "1") Integer current, - @RequestParam(defaultValue = "50") Integer size) { + @RequestParam(defaultValue = "20") Integer size) { return R.data(oaSyncService.syncPersonFromUserList(current, size)); } diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/OASyncServiceImpl.java b/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/OASyncServiceImpl.java index 6e0c3e9..0a02139 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/OASyncServiceImpl.java +++ b/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/OASyncServiceImpl.java @@ -266,7 +266,7 @@ public class OASyncServiceImpl implements IOASyncService { */ private OaPersonSyncPageVO syncPersonFromOaPage(int current, int size) { int pageNo = current < 1 ? 1 : current; - int pageSize = size < 1 ? 50 : Math.min(size, 200); + int pageSize = size < 1 ? 20 : Math.min(size, 200); OAPersonSearch personSearch = buildPersonSearch(null); personSearch.setCurPage(pageNo); personSearch.setPageSize(pageSize); @@ -309,7 +309,7 @@ public class OASyncServiceImpl implements IOASyncService { private OAPersonSearch buildPersonSearch(Date startTime) { OAPersonSearch personSearch = new OAPersonSearch(); personSearch.setCurPage(1); - personSearch.setPageSize(200); + personSearch.setPageSize(20); personSearch.setCreated(""); personSearch.setWorkcode(""); personSearch.setSubcompanyid1(""); diff --git a/blade-third-party-api/blade-oa-api/src/main/java/org/springblade/thirdparty/oa/config/OAFeignClientConfig.java b/blade-third-party-api/blade-oa-api/src/main/java/org/springblade/thirdparty/oa/config/OAFeignClientConfig.java index ef4306a..c803caa 100644 --- a/blade-third-party-api/blade-oa-api/src/main/java/org/springblade/thirdparty/oa/config/OAFeignClientConfig.java +++ b/blade-third-party-api/blade-oa-api/src/main/java/org/springblade/thirdparty/oa/config/OAFeignClientConfig.java @@ -1,24 +1,45 @@ package org.springblade.thirdparty.oa.config; +import feign.Logger; import feign.Request; import org.springblade.thirdparty.oa.interceptor.OARequestInterceptor; +import org.springframework.cloud.openfeign.clientconfig.FeignClientConfigurer; import org.springframework.context.annotation.Bean; import java.util.concurrent.TimeUnit; /** - * OA Feign 客户端配置 + * OA Feign 客户端配置。 + *

+ * 必须关闭父上下文继承,否则全局 {@code BladeFeignRequestInterceptor} + * 会把当前登录请求的 Host、Content-Length、Blade-Auth 等头再次写入, + * 导致 gwzh nginx 返回 400。 * * @author bfhuange * @since 2024/12/18 */ public class OAFeignClientConfig { + @Bean + public FeignClientConfigurer feignClientConfigurer() { + return new FeignClientConfigurer() { + @Override + public boolean inheritParentConfiguration() { + return false; + } + }; + } + @Bean public OARequestInterceptor requestInterceptor(OAProperties oaProperties) { return new OARequestInterceptor(oaProperties); } + @Bean + public Logger.Level feignLoggerLevel() { + return Logger.Level.FULL; + } + @Bean public Request.Options options() { return new Request.Options(10, TimeUnit.SECONDS, 120, TimeUnit.SECONDS, true); diff --git a/blade-third-party-api/blade-oa-api/src/main/java/org/springblade/thirdparty/oa/interceptor/OARequestInterceptor.java b/blade-third-party-api/blade-oa-api/src/main/java/org/springblade/thirdparty/oa/interceptor/OARequestInterceptor.java index fa6e580..e3d7c17 100644 --- a/blade-third-party-api/blade-oa-api/src/main/java/org/springblade/thirdparty/oa/interceptor/OARequestInterceptor.java +++ b/blade-third-party-api/blade-oa-api/src/main/java/org/springblade/thirdparty/oa/interceptor/OARequestInterceptor.java @@ -34,16 +34,21 @@ import org.springblade.thirdparty.oa.config.OAProperties; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.Locale; +import java.util.Map; import java.util.Set; /** * OA Feign 请求拦截器。 *

- * 对齐可用 curl:仅发送 Authorization + Content-Type,并清掉登录请求透传头, - * 避免 nginx 因 Host/Content-Length/Blade-Auth 等返回 400。 + * 对齐可用 curl:仅发送 Authorization + Content-Type。 + * 配合 {@code FeignClientConfigurer#inheritParentConfiguration()=false}, + * 避免全局 BladeFeignRequestInterceptor 透传登录请求头。 * * @author Chill */ @@ -53,38 +58,16 @@ public class OARequestInterceptor implements RequestInterceptor { private static final String BASIC_PREFIX = "Basic "; private static final String BEARER_PREFIX = "Bearer "; - private static final Set STRIP_HEADERS = Set.of( - HttpHeaders.HOST.toLowerCase(Locale.ROOT), - HttpHeaders.CONTENT_LENGTH.toLowerCase(Locale.ROOT), - HttpHeaders.CONTENT_TYPE.toLowerCase(Locale.ROOT), - HttpHeaders.ACCEPT.toLowerCase(Locale.ROOT), - HttpHeaders.CONNECTION.toLowerCase(Locale.ROOT), - HttpHeaders.TRANSFER_ENCODING.toLowerCase(Locale.ROOT), - HttpHeaders.COOKIE.toLowerCase(Locale.ROOT), + private static final Set KEEP_HEADERS = Set.of( HttpHeaders.AUTHORIZATION.toLowerCase(Locale.ROOT), - HttpHeaders.ACCEPT_ENCODING.toLowerCase(Locale.ROOT), - HttpHeaders.ORIGIN.toLowerCase(Locale.ROOT), - HttpHeaders.REFERER.toLowerCase(Locale.ROOT), - HttpHeaders.EXPECT.toLowerCase(Locale.ROOT), - "keep-alive", - "upgrade", - "te", - "trailer", - "forwarded", - "x-real-ip", - "x-request-id", - "blade-auth", - "blade-requested-with", - "tenant-id", - "auth" + HttpHeaders.CONTENT_TYPE.toLowerCase(Locale.ROOT) ); private final OAProperties oaProperties; @Override public void apply(RequestTemplate template) { - stripForwardedHeaders(template); - // 与可用 curl 保持一致:Authorization + Content-Type + stripUnwantedHeaders(template); template.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE); String authorization = normalizeAuthorization(oaProperties.getAuthorization()); @@ -93,17 +76,37 @@ public class OARequestInterceptor implements RequestInterceptor { } else { log.warn("OA Feign 未配置 third-party.oa.authorization,gwzh 网关可能拒绝请求"); } + + logRequest(template); } - private void stripForwardedHeaders(RequestTemplate template) { - List headerNames = new ArrayList<>(template.headers().keySet()); + /** + * 打印 OA Feign 最终发出的请求头与 body,便于对照 curl。 + */ + private void logRequest(RequestTemplate template) { + String bodyText = ""; + byte[] body = template.body(); + if (body != null && body.length > 0) { + Charset charset = template.requestCharset() == null ? StandardCharsets.UTF_8 : template.requestCharset(); + bodyText = new String(body, charset); + } + log.info("OA Feign 请求 method={}, url={}{}{}, headers={}, body={}", + template.method(), + template.feignTarget() == null ? "" : template.feignTarget().url(), + template.path(), + template.queryLine() == null ? "" : template.queryLine(), + template.headers(), + bodyText); + } + + /** + * 只保留 Authorization / Content-Type,其余全部移除。 + */ + private void stripUnwantedHeaders(RequestTemplate template) { + Map> headers = template.headers(); + List headerNames = new ArrayList<>(headers.keySet()); for (String headerName : headerNames) { - String lowerName = headerName.toLowerCase(Locale.ROOT); - if (STRIP_HEADERS.contains(lowerName) - || lowerName.startsWith("x-forwarded-") - || lowerName.startsWith("blade-") - || lowerName.startsWith("x-b3-") - || lowerName.startsWith("sw8")) { + if (!KEEP_HEADERS.contains(headerName.toLowerCase(Locale.ROOT))) { template.removeHeader(headerName); } }