You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@linkis.apache.org by ca...@apache.org on 2022/05/05 11:34:25 UTC

[incubator-linkis] 04/05: add gateway url to request headers

This is an automated email from the ASF dual-hosted git repository.

casion pushed a commit to branch dev-1.1.2
in repository https://gitbox.apache.org/repos/asf/incubator-linkis.git

commit be397a29cb4d0b17379e71307f474850999b31be
Author: peacewong <wp...@gmail.com>
AuthorDate: Thu May 5 16:21:07 2022 +0800

    add gateway url to request headers
---
 .../linkis/gateway/security/SecurityFilter.scala   | 18 +++++++--------
 .../SpringCloudGatewayConfiguration.scala          | 17 ++++++++++----
 .../http/LinkisGatewayHttpHeadersFilter.scala}     | 27 ++++++++++++++++------
 3 files changed, 40 insertions(+), 22 deletions(-)

diff --git a/linkis-spring-cloud-services/linkis-service-gateway/linkis-gateway-core/src/main/scala/org/apache/linkis/gateway/security/SecurityFilter.scala b/linkis-spring-cloud-services/linkis-service-gateway/linkis-gateway-core/src/main/scala/org/apache/linkis/gateway/security/SecurityFilter.scala
index d7f932356..f2cc89c58 100644
--- a/linkis-spring-cloud-services/linkis-service-gateway/linkis-gateway-core/src/main/scala/org/apache/linkis/gateway/security/SecurityFilter.scala
+++ b/linkis-spring-cloud-services/linkis-service-gateway/linkis-gateway-core/src/main/scala/org/apache/linkis/gateway/security/SecurityFilter.scala
@@ -17,26 +17,25 @@
  
 package org.apache.linkis.gateway.security
 
-import java.io.File
-import java.text.DateFormat
-import java.util
-import java.util.concurrent.TimeUnit
-import java.util.{Date, Locale}
+import org.apache.commons.lang.StringUtils
+import org.apache.commons.lang.exception.ExceptionUtils
 import org.apache.linkis.common.conf.Configuration
 import org.apache.linkis.common.exception.LinkisException
 import org.apache.linkis.common.utils.{Logging, Utils}
 import org.apache.linkis.gateway.config.GatewayConfiguration
 import org.apache.linkis.gateway.config.GatewayConfiguration._
-import org.apache.linkis.gateway.http.{GatewayContext, GatewayHttpUtils}
+import org.apache.linkis.gateway.http.GatewayContext
 import org.apache.linkis.gateway.security.sso.SSOInterceptor
 import org.apache.linkis.gateway.security.token.TokenAuthentication
 import org.apache.linkis.server.conf.ServerConfiguration
 import org.apache.linkis.server.exception.{LoginExpireException, NonLoginException}
 import org.apache.linkis.server.{Message, validateFailed}
-import org.apache.commons.lang.StringUtils
-import org.apache.commons.lang.exception.ExceptionUtils
 
-import java.util.regex.Pattern
+import java.io.File
+import java.text.DateFormat
+import java.util
+import java.util.concurrent.TimeUnit
+import java.util.{Date, Locale}
 
 object SecurityFilter extends Logging {
 
@@ -63,7 +62,6 @@ object SecurityFilter extends Logging {
         return false
       }
     }
-    GatewayHttpUtils.addGateWayUrlToRequest(gatewayContext)
     if (refererValidate) {
       //Security certification support, referer limited(安全认证支持,referer限定)
       val referer = gatewayContext.getRequest.getHeaders.get("Referer")
diff --git a/linkis-spring-cloud-services/linkis-service-gateway/linkis-spring-cloud-gateway/src/main/scala/org/apache/linkis/gateway/springcloud/SpringCloudGatewayConfiguration.scala b/linkis-spring-cloud-services/linkis-service-gateway/linkis-spring-cloud-gateway/src/main/scala/org/apache/linkis/gateway/springcloud/SpringCloudGatewayConfiguration.scala
index 444cb055b..77f3bffd4 100644
--- a/linkis-spring-cloud-services/linkis-service-gateway/linkis-spring-cloud-gateway/src/main/scala/org/apache/linkis/gateway/springcloud/SpringCloudGatewayConfiguration.scala
+++ b/linkis-spring-cloud-services/linkis-service-gateway/linkis-spring-cloud-gateway/src/main/scala/org/apache/linkis/gateway/springcloud/SpringCloudGatewayConfiguration.scala
@@ -23,12 +23,13 @@ import org.apache.linkis.common.utils.Logging
 import org.apache.linkis.gateway.config.GatewaySpringConfiguration
 import org.apache.linkis.gateway.parser.{DefaultGatewayParser, GatewayParser}
 import org.apache.linkis.gateway.route.{DefaultGatewayRouter, GatewayRouter}
-import org.apache.linkis.gateway.springcloud.http.GatewayAuthorizationFilter
+import org.apache.linkis.gateway.springcloud.http.{GatewayAuthorizationFilter, LinkisGatewayHttpHeadersFilter}
 import org.apache.linkis.gateway.springcloud.websocket.SpringCloudGatewayWebsocketFilter
 import org.apache.linkis.rpc.Sender
 import org.apache.linkis.server.conf.ServerConfiguration
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.boot.autoconfigure.AutoConfigureAfter
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty
 import org.springframework.cloud.client
 import org.springframework.cloud.client.loadbalancer.LoadBalancerClient
 import org.springframework.cloud.gateway.config.{GatewayAutoConfiguration, GatewayProperties}
@@ -82,10 +83,10 @@ class SpringCloudGatewayConfiguration {
       }).build()
 
   @Bean
-  def createLoadBalancerClient(springClientFactory: SpringClientFactory):RibbonLoadBalancerClient = new RibbonLoadBalancerClient(springClientFactory) {
-    override def getServer(serviceId: String): Server = if(isMergeModuleInstance(serviceId)) {
+  def createLoadBalancerClient(springClientFactory: SpringClientFactory): RibbonLoadBalancerClient = new RibbonLoadBalancerClient(springClientFactory) {
+    override def getServer(serviceId: String): Server = if (isMergeModuleInstance(serviceId)) {
       val serviceInstance = getServiceInstance(serviceId)
-      info("redirect to " + serviceInstance)  //TODO test,wait for delete
+      info("redirect to " + serviceInstance)
       val lb = this.getLoadBalancer(serviceInstance.getApplicationName)
       lb.getAllServers.find(_.getHostPort == serviceInstance.getInstance).get
     } else super.getServer(serviceId)
@@ -102,7 +103,7 @@ class SpringCloudGatewayConfiguration {
       serverIntrospector
     }
 
-    override def choose(serviceId: String, hint:Any): client.ServiceInstance = if(isMergeModuleInstance(serviceId)) {
+    override def choose(serviceId: String, hint: Any): client.ServiceInstance = if (isMergeModuleInstance(serviceId)) {
       val serviceInstance = getServiceInstance(serviceId)
       info("redirect to " + serviceInstance)
       val lb = this.getLoadBalancer(serviceInstance.getApplicationName)
@@ -111,6 +112,12 @@ class SpringCloudGatewayConfiguration {
     } else super.choose(serviceId, hint)
   }
 
+  @Bean
+  @ConditionalOnProperty(name = Array("spring.cloud.gateway.url.enabled"), matchIfMissing = true)
+  def linkisGatewayHttpHeadersFilter(): LinkisGatewayHttpHeadersFilter = {
+    new LinkisGatewayHttpHeadersFilter()
+  }
+
 }
 object SpringCloudGatewayConfiguration extends Logging {
   private val MERGE_MODULE_INSTANCE_HEADER = "merge-gw-"
diff --git a/linkis-spring-cloud-services/linkis-service-gateway/linkis-gateway-core/src/main/scala/org/apache/linkis/gateway/http/GatewayHttpUtils.scala b/linkis-spring-cloud-services/linkis-service-gateway/linkis-spring-cloud-gateway/src/main/scala/org/apache/linkis/gateway/springcloud/http/LinkisGatewayHttpHeadersFilter.scala
similarity index 60%
rename from linkis-spring-cloud-services/linkis-service-gateway/linkis-gateway-core/src/main/scala/org/apache/linkis/gateway/http/GatewayHttpUtils.scala
rename to linkis-spring-cloud-services/linkis-service-gateway/linkis-spring-cloud-gateway/src/main/scala/org/apache/linkis/gateway/springcloud/http/LinkisGatewayHttpHeadersFilter.scala
index 9951ad1da..dfb0e9671 100644
--- a/linkis-spring-cloud-services/linkis-service-gateway/linkis-gateway-core/src/main/scala/org/apache/linkis/gateway/http/GatewayHttpUtils.scala
+++ b/linkis-spring-cloud-services/linkis-service-gateway/linkis-spring-cloud-gateway/src/main/scala/org/apache/linkis/gateway/springcloud/http/LinkisGatewayHttpHeadersFilter.scala
@@ -15,29 +15,42 @@
  * limitations under the License.
  */
 
-package org.apache.linkis.gateway.http
+package org.apache.linkis.gateway.springcloud.http
 
 import org.apache.commons.lang3.StringUtils
 import org.apache.linkis.gateway.config.GatewayConfiguration.{THIS_GATEWAY_SCHEMA, THIS_GATEWAY_URL}
 import org.apache.linkis.rpc.Sender
+import org.springframework.cloud.gateway.filter.headers.HttpHeadersFilter
+import org.springframework.core.Ordered
+import org.springframework.http.HttpHeaders
+import org.springframework.http.server.reactive.ServerHttpRequest
+import org.springframework.web.server.ServerWebExchange
 
-
-object GatewayHttpUtils {
+class LinkisGatewayHttpHeadersFilter extends HttpHeadersFilter with  Ordered{
 
   private val GATEWAY_URL = "GATEWAY_URL"
 
-  def addGateWayUrlToRequest(gatewayContext: GatewayContext): Unit = {
+  override def filter(input: HttpHeaders, exchange: ServerWebExchange): HttpHeaders = {
+    val request: ServerHttpRequest = exchange.getRequest
+    val updated: HttpHeaders = new HttpHeaders
+    val iterator = input.entrySet().iterator()
+    while (iterator.hasNext) {
+      val next = iterator.next()
+      updated.addAll(next.getKey, next.getValue)
+    }
     val gatewWayURL = if (StringUtils.isNotBlank(THIS_GATEWAY_URL.getValue)) {
       THIS_GATEWAY_URL.getValue
     } else {
       val schema = if (StringUtils.isNotBlank(THIS_GATEWAY_SCHEMA.getValue)) {
         THIS_GATEWAY_SCHEMA.getValue
       } else {
-        gatewayContext.getRequest.getURI.getScheme
+        request.getURI.getScheme
       }
       s"$schema://${Sender.getThisInstance}"
     }
-    val array = Array(gatewWayURL)
-    gatewayContext.getRequest.addHeader(GATEWAY_URL, array)
+    updated.add(GATEWAY_URL, gatewWayURL)
+    updated
   }
+
+  override def getOrder: Int = 1
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@linkis.apache.org
For additional commands, e-mail: commits-help@linkis.apache.org