Pārlūkot izejas kodu

修改网关服务器,增加过滤器

郭志波 5 gadi atpakaļ
vecāks
revīzija
60b3f8be53

+ 42 - 8
src/main/java/com/leanwo/gateway/GlobalAccountFilter.java

@@ -1,10 +1,16 @@
 package com.leanwo.gateway;
 
+import java.net.URI;
+import java.net.URISyntaxException;
 import java.util.List;
 
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cloud.gateway.filter.GatewayFilterChain;
 import org.springframework.cloud.gateway.filter.GlobalFilter;
+import org.springframework.cloud.gateway.filter.LoadBalancerClientFilter;
 import org.springframework.core.Ordered;
 import org.springframework.http.server.reactive.ServerHttpRequest;
 import org.springframework.stereotype.Component;
@@ -12,6 +18,7 @@ import org.springframework.web.server.ServerWebExchange;
 
 import com.leanwo.gateway.dto.AccountManagementDto;
 import com.leanwo.gateway.service.AccountManagementService;
+import com.leanwo.gateway.service.AccountManagementServiceImpl;
 import com.leanwo.gateway.util.SpringUtil;
 
 import reactor.core.publisher.Mono;
@@ -23,7 +30,8 @@ import reactor.core.publisher.Mono;
  */
 @Component//注入Spring容器
 public class GlobalAccountFilter implements GlobalFilter, Ordered{
-
+	
+	private static Logger logger = LoggerFactory.getLogger(GlobalAccountFilter.class);
 
 	@Autowired
 	private AccountManagementService accountManagementService;
@@ -36,7 +44,7 @@ public class GlobalAccountFilter implements GlobalFilter, Ordered{
      */
 	@Override
 	public int getOrder() {
-		return 0;
+		return LoadBalancerClientFilter.LOAD_BALANCER_CLIENT_FILTER_ORDER - 1;
 	}
 
 	@Override
@@ -48,19 +56,45 @@ public class GlobalAccountFilter implements GlobalFilter, Ordered{
          */
         //获取请求参数
         ServerHttpRequest request = exchange.getRequest();
-        String url = request.getURI().toString();
+        //原始uri
+        URI originUri = request.getURI();
+        //构造器
+        ServerHttpRequest.Builder mutate = request.mutate();
+        //需要重定向的uri
+        String forwardedUri = originUri.toString();
+        if (StringUtils.startsWith(forwardedUri, "https")) {
+            try {
+                //重新生成http请求方式的uri
+                URI uri = new URI(
+                        "http",
+                        originUri.getUserInfo(),
+                        originUri.getHost(),
+                        originUri.getPort(),
+                        originUri.getPath(),
+                        originUri.getQuery(),
+                        originUri.getFragment()
+                );
+                mutate.uri(uri);
+            } catch (URISyntaxException e) {
+                throw new IllegalStateException(e.getMessage(), e);
+            }
+        }
+        //重新构建
+        ServerHttpRequest build = mutate.build();
+        
+        String url = originUri.toString();
         String path = request.getPath().toString();
         int endIndex = url.length() - path.length();
         //获取域名
         String domainName = url.substring(0, endIndex);
+        logger.debug("未截取前域名:" + domainName);
         domainName = domainName.replace("http://", "").replace("https://", "");
-        
+        logger.debug("域名:" + domainName);
         Long accountId = accountManagementService.getAccountIdByDomainName(domainName);
     	
     	request.mutate().header("account", accountId.toString()).build();
-    	
-        //放行
-        return chain.filter(exchange);//代表放行请求
+    	//代表放行请求
+        return chain.filter(exchange.mutate().request(build).build());
 	}
-
+	
 }

+ 52 - 0
src/main/java/com/leanwo/gateway/HttpSchemeFilter.java

@@ -0,0 +1,52 @@
+package com.leanwo.gateway;
+
+import java.net.URI;
+
+import org.apache.commons.lang.StringUtils;
+import org.springframework.cloud.gateway.filter.GatewayFilterChain;
+import org.springframework.cloud.gateway.filter.GlobalFilter;
+import org.springframework.cloud.gateway.filter.LoadBalancerClientFilter;
+import org.springframework.cloud.gateway.support.ServerWebExchangeUtils;
+import org.springframework.core.Ordered;
+import org.springframework.stereotype.Component;
+import org.springframework.web.server.ServerWebExchange;
+import org.springframework.web.util.UriComponentsBuilder;
+
+import reactor.core.publisher.Mono;
+
+@Component
+public class HttpSchemeFilter implements GlobalFilter, Ordered{
+	@Override
+    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
+        //获取uri
+        Object uriObj = exchange.getAttributes().get(ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR);
+        if (uriObj instanceof URI) {
+            URI uri = (URI) uriObj;
+            //替换为http
+            uri = upgradeConnection(uri, "http");
+            exchange.getAttributes().put(ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR, uri);
+        }
+
+        return chain.filter(exchange);
+    }
+
+    /**
+     * 更新scheme
+     *
+     * @param uri
+     * @param scheme
+     * @return
+     */
+    private URI upgradeConnection(URI uri, String scheme) {
+        UriComponentsBuilder builder = UriComponentsBuilder.fromUri(uri).scheme(scheme);
+        if (!StringUtils.isEmpty(uri.getRawQuery())) {
+            builder.replaceQueryParam(uri.getRawQuery().replace("+", "%20"));
+        }
+        return builder.build(true).toUri();
+    }
+
+    @Override
+    public int getOrder() {
+        return LoadBalancerClientFilter.LOAD_BALANCER_CLIENT_FILTER_ORDER + 1;
+    }
+}

+ 1 - 1
src/main/java/com/leanwo/gateway/rest/AccountManagementResource.java

@@ -12,7 +12,7 @@ import com.leanwo.gateway.service.AccountManagementService;
 
 
 @RestController
-@RequestMapping("/api/AccountManagmentResource")
+@RequestMapping("/api/AccountManagementResource")
 public class AccountManagementResource {
 
 	@Autowired