在 Spring Cloud 转发请求之前我们如何做一些处理?

How can we do some processing before forwarding the request in Spring Cloud?

我最近开始使用 Spring Cloud。我的用例如下:

两种服务类型:

  1. X(spring 云应用充当反向代理)
  2. A、B、C(spring 单独部署的引导应用程序)

每当有人想要访问 A、B 或 C 中的任何端点时,他们都会向 X 发出请求,X 会根据路径将他们重定向到 A、B、C。参见 application.yml X:

spring:
  cloud:
    gateway:
      routes:
        - id: A
          uri: http://localhost:8081
          predicates:
            - Path=/a/**
        - id: B
          uri: http://localhost:8082
          predicates:
            - Path=/b/**
        - id: C
          uri: http://localhost:8083
          predicates:
            - Path=/c/**

这按预期工作并将请求转发给 A、B、C。

虽然在转发之前,我们想要验证请求。

所以流程将是这样的:

  1. X 收到请求
  2. 请求已拦截,data/request 从该请求中获取参数
  3. 请求在 X 本身内进行身份验证
  4. 如果请求通过身份验证,则我们根据路径将请求转发给 A、B 或 C

我无法理解如何执行第 2 步和第 3 步。第 1 步和第 4 步已经在 application.yml 文件中定义,没有单独的代码,只有主要 class .没有休息控制器或任何东西。

我们仅有的 2 个依赖项是:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

如果问题需要澄清,请告诉我

我的项目中也有类似的需求。我必须基于 jwt 令牌授权用户。请访问 https://cloud.spring.io/spring-cloud-gateway/multi/multi__developer_guide.html 配置您的预身份验证问题。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.core.env.Environment;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;

import com.google.common.net.HttpHeaders;

import reactor.core.publisher.Mono;

@Component
public class AuthorizationHeaderFilter extends AbstractGatewayFilterFactory<AuthorizationHeaderFilter.Config> {

    @Autowired
    private Environment env;

    public AuthorizationHeaderFilter() {
        super(Config.class);
    }
    
    public static class Config {
        // TODO Put filter configuration here
    }

    @Override
    public GatewayFilter apply(Config config) {
        return (exchange, chain) -> {
            ServerHttpRequest request = exchange.getRequest();
            if (!request.getHeaders().containsKey(HttpHeaders.AUTHORIZATION)) {
                return onError(exchange, "No Authorization header.", HttpStatus.UNAUTHORIZED);
            }
            return chain.filter(exchange);

        };
    }

    private Mono<Void> onError(ServerWebExchange exchange, String err, HttpStatus httpStatus) {
        ServerHttpResponse response = exchange.getResponse();
        response.setStatusCode(httpStatus);
        return response.setComplete();
    }

}

注意:除此代码外,您还必须在 application.properties 文件中使用过滤器配置路由。

spring.cloud.gateway.routes[0].id=unique_id_for_endpoint
spring.cloud.gateway.routes[0].uri=lb://ENDPOINTROOT
spring.cloud.gateway.routes[0].predicates[1]=Method=GET,POST,PUT,DELETE
spring.cloud.gateway.routes[0].filters[0]=RemoveRequestHeader=Cookie
spring.cloud.gateway.routes[0].filters[2]=AuthorizationHeaderFilter
##Rewriting URL Path
spring.cloud.gateway.routes[0].predicates[0]=Path=/API/end/point/check
spring.cloud.gateway.routes[0].filters[1]=RewritePath=/API/(?<segment>.*) ,/$\{segment}