Просмотр исходного кода

fix 修复 mvc版本网关 X-Forwarded-Prefix 被过滤器删除问题 改为请求头处理的时候添加 避免此问题

疯狂的狮子Li 3 недель назад
Родитель
Сommit
ff9f727f20

+ 1 - 17
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);

+ 52 - 0
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<String, List<String>> 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];
+    }
+
+}