Browse Source

添加通过 http header X-Base-Url 来动态传入 baseUrl 的功能 (#252)

* 将 baseUrl 拼接挪到 else 分支下消除特殊情况下(不走else)不必要的拼接处理

* 添加通过 Http Header X-Base-Url 来动态赋值 baseUrl 的功能来实现更灵活代理支持
kischn.sun 2 years ago
parent
commit
026656711d
1 changed files with 14 additions and 6 deletions
  1. 14 6
      server/src/main/java/cn/keking/web/filter/BaseUrlFilter.java

+ 14 - 6
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);