From f1abb4eb4de923b1bd64a2b14a2dbae5008dc74f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Tue, 30 Jun 2026 17:15:45 +0800 Subject: [PATCH] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20mvc=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E7=BD=91=E5=85=B3=20X-Forwarded-Prefix=20=E8=A2=AB?= =?UTF-8?q?=E8=BF=87=E6=BB=A4=E5=99=A8=E5=88=A0=E9=99=A4=E9=97=AE=E9=A2=98?= =?UTF-8?q?=20=E6=94=B9=E4=B8=BA=E8=AF=B7=E6=B1=82=E5=A4=B4=E5=A4=84?= =?UTF-8?q?=E7=90=86=E7=9A=84=E6=97=B6=E5=80=99=E6=B7=BB=E5=8A=A0=20?= =?UTF-8?q?=E9=81=BF=E5=85=8D=E6=AD=A4=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gateway/filter/ForwardAuthFilter.java | 18 +------ .../gateway/filter/ForwardHeadersFilter.java | 52 +++++++++++++++++++ 2 files changed, 53 insertions(+), 17 deletions(-) create mode 100644 ruoyi-gateway/src/main/java/org/dromara/gateway/filter/ForwardHeadersFilter.java diff --git a/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/ForwardAuthFilter.java b/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/ForwardAuthFilter.java index f1ff79c95..5879c2c19 100644 --- a/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/ForwardAuthFilter.java +++ b/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/ForwardAuthFilter.java @@ -10,15 +10,13 @@ import org.dromara.gateway.filter.support.MutableHttpServletRequest; import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; -import org.springframework.util.StringUtils; import org.springframework.web.filter.OncePerRequestFilter; import java.io.IOException; /** * 转发请求头过滤器: - * 1. 动态透传 X-Forwarded-Prefix - * 2. 转发内部 same-token + * 1. 转发内部 same-token * * @author Lion Li */ @@ -36,12 +34,6 @@ public class ForwardAuthFilter extends OncePerRequestFilter { throws ServletException, IOException { MutableHttpServletRequest newRequest = null; - String forwardedPrefix = resolveForwardedPrefix(request); - if (forwardedPrefix != null) { - newRequest = getOrCreateMutableRequest(request, newRequest); - newRequest.putHeader("X-Forwarded-Prefix", forwardedPrefix); - } - if (SaManager.getConfig().getCheckSameToken()) { newRequest = getOrCreateMutableRequest(request, newRequest); newRequest.putHeader(SaSameUtil.SAME_TOKEN, SaSameUtil.getToken()); @@ -50,14 +42,6 @@ public class ForwardAuthFilter extends OncePerRequestFilter { filterChain.doFilter(newRequest == null ? request : newRequest, response); } - private String resolveForwardedPrefix(HttpServletRequest request) { - String[] pathSegments = StringUtils.tokenizeToStringArray(request.getRequestURI(), "/"); - if (pathSegments.length == 0) { - return null; - } - return "/" + pathSegments[0]; - } - private MutableHttpServletRequest getOrCreateMutableRequest(HttpServletRequest request, MutableHttpServletRequest currentRequest) { return currentRequest != null ? currentRequest : new MutableHttpServletRequest(request); diff --git a/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/ForwardHeadersFilter.java b/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/ForwardHeadersFilter.java new file mode 100644 index 000000000..b704eed4d --- /dev/null +++ b/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/ForwardHeadersFilter.java @@ -0,0 +1,52 @@ +package org.dromara.gateway.filter; + +import jakarta.servlet.http.HttpServletRequest; +import org.springframework.cloud.gateway.server.mvc.filter.HttpHeadersFilter.RequestHttpHeadersFilter; +import org.springframework.core.Ordered; +import org.springframework.http.HttpHeaders; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; +import org.springframework.web.servlet.function.ServerRequest; + +import java.util.List; +import java.util.Map; + +/** + * Gateway MVC 下游请求头过滤器,补充服务访问前缀。 + * + * @author Lion Li + */ +@Component +public class ForwardHeadersFilter implements RequestHttpHeadersFilter, Ordered { + + private static final String X_FORWARDED_PREFIX = "X-Forwarded-Prefix"; + + @Override + public int getOrder() { + return 1; + } + + @Override + public HttpHeaders apply(HttpHeaders input, ServerRequest request) { + String forwardedPrefix = resolveForwardedPrefix(request.servletRequest()); + if (forwardedPrefix == null) { + return input; + } + + HttpHeaders headers = new HttpHeaders(); + for (Map.Entry> entry : input.headerSet()) { + headers.addAll(entry.getKey(), entry.getValue()); + } + headers.set(X_FORWARDED_PREFIX, forwardedPrefix); + return headers; + } + + private String resolveForwardedPrefix(HttpServletRequest request) { + String[] pathSegments = StringUtils.tokenizeToStringArray(request.getRequestURI(), "/"); + if (pathSegments.length == 0) { + return null; + } + return "/" + pathSegments[0]; + } + +}