diff --git a/ruoyi-gateway-mvc/src/main/java/org/dromara/gateway/filter/ForwardAuthFilter.java b/ruoyi-gateway-mvc/src/main/java/org/dromara/gateway/filter/ForwardAuthFilter.java index f1ff79c95..5879c2c19 100644 --- a/ruoyi-gateway-mvc/src/main/java/org/dromara/gateway/filter/ForwardAuthFilter.java +++ b/ruoyi-gateway-mvc/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-mvc/src/main/java/org/dromara/gateway/filter/ForwardHeadersFilter.java b/ruoyi-gateway-mvc/src/main/java/org/dromara/gateway/filter/ForwardHeadersFilter.java new file mode 100644 index 000000000..b704eed4d --- /dev/null +++ b/ruoyi-gateway-mvc/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]; + } + +}