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

This commit is contained in:
疯狂的狮子Li
2026-06-30 17:17:08 +08:00
parent 11b2d28c07
commit ff9f727f20
2 changed files with 53 additions and 17 deletions
@@ -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);
@@ -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];
}
}