From 026656711debd4fedd0262865d914cc0bb7ae39e Mon Sep 17 00:00:00 2001 From: "kischn.sun" Date: Mon, 1 Aug 2022 14:01:04 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=80=9A=E8=BF=87=20http=20h?= =?UTF-8?q?eader=20X-Base-Url=20=E6=9D=A5=E5=8A=A8=E6=80=81=E4=BC=A0?= =?UTF-8?q?=E5=85=A5=20baseUrl=20=E7=9A=84=E5=8A=9F=E8=83=BD=20(#252)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 将 baseUrl 拼接挪到 else 分支下消除特殊情况下(不走else)不必要的拼接处理 * 添加通过 Http Header X-Base-Url 来动态赋值 baseUrl 的功能来实现更灵活代理支持 --- .../cn/keking/web/filter/BaseUrlFilter.java | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/server/src/main/java/cn/keking/web/filter/BaseUrlFilter.java b/server/src/main/java/cn/keking/web/filter/BaseUrlFilter.java index 1b2b61a2..1df0f5fe 100644 --- a/server/src/main/java/cn/keking/web/filter/BaseUrlFilter.java +++ b/server/src/main/java/cn/keking/web/filter/BaseUrlFilter.java @@ -1,6 +1,7 @@ package cn.keking.web.filter; import cn.keking.config.ConfigConstants; +import org.apache.commons.lang3.StringUtils; import org.springframework.web.context.request.RequestContextHolder; import javax.servlet.*; @@ -18,7 +19,7 @@ public class BaseUrlFilter implements Filter { public static String getBaseUrl() { String baseUrl; try { - baseUrl = (String) RequestContextHolder.currentRequestAttributes().getAttribute("baseUrl",0); + baseUrl = (String) RequestContextHolder.currentRequestAttributes().getAttribute("baseUrl", 0); } catch (Exception e) { baseUrl = BASE_URL; } @@ -33,18 +34,25 @@ public class BaseUrlFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { + String baseUrl; - StringBuilder pathBuilder = new StringBuilder(); - pathBuilder.append(request.getScheme()).append("://").append(request.getServerName()).append(":") - .append(request.getServerPort()).append(((HttpServletRequest) request).getContextPath()).append("/"); String baseUrlTmp = ConfigConstants.getBaseUrl(); - if (baseUrlTmp != null && !ConfigConstants.DEFAULT_BASE_URL.equalsIgnoreCase(baseUrlTmp)) { + + final HttpServletRequest servletRequest = (HttpServletRequest) request; + // 支持通过 http header 中 X-Base-Url 来动态设置 baseUrl 以支持多个域名/项目的共享使用 + final String urlInHeader = servletRequest.getHeader("X-Base-Url"); + if (StringUtils.isNotEmpty(urlInHeader)) { + baseUrl = urlInHeader; + } else if (baseUrlTmp != null && !ConfigConstants.DEFAULT_BASE_URL.equalsIgnoreCase(baseUrlTmp)) { + // 如果配置文件中配置了 baseUrl 且不为 default 则以配置文件为准 if (!baseUrlTmp.endsWith("/")) { baseUrlTmp = baseUrlTmp.concat("/"); } baseUrl = baseUrlTmp; } else { - baseUrl = pathBuilder.toString(); + // 动态拼接 baseUrl + baseUrl = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + + servletRequest.getContextPath() + "/"; } BASE_URL = baseUrl; request.setAttribute("baseUrl", baseUrl);