在 Spring Cloud 转发请求之前我们如何做一些处理?
How can we do some processing before forwarding the request in Spring Cloud?
我最近开始使用 Spring Cloud。我的用例如下:
两种服务类型:
- X(spring 云应用充当反向代理)
- 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。
虽然在转发之前,我们想要验证请求。
所以流程将是这样的:
- X 收到请求
- 请求已拦截,data/request 从该请求中获取参数
- 请求在 X 本身内进行身份验证
- 如果请求通过身份验证,则我们根据路径将请求转发给 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}
我最近开始使用 Spring Cloud。我的用例如下:
两种服务类型:
- X(spring 云应用充当反向代理)
- 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。
虽然在转发之前,我们想要验证请求。
所以流程将是这样的:
- X 收到请求
- 请求已拦截,data/request 从该请求中获取参数
- 请求在 X 本身内进行身份验证
- 如果请求通过身份验证,则我们根据路径将请求转发给 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}