路由过滤器 GatewayFilter
GatewayFilter是网关中提供的一种过滤波器,可以对进去网关的请求和微服务返回的响应最处理:
过滤器工厂 GatewayFilterFactory
spring提供里了31种不同的过滤器工厂,例如:
具体可以到官网查看,里面都有详细使用方法
案例 给某个服务添j加请求头
gateway工程种的.yml文件加上
filters: AddRequestHeader=Truth,xxx is freaking aowsome! 即可(请求头中出现Truth: xxx is freaking aowsome!)
spring:
application:
name: gateway
cloud:
gateway:
routes:
- id: user-service # 路由唯一标识
# uri: http://127.0.0.1:8081 # 路由目标地址 固定地址
uri: lb://userService # 路由目标地址 lb就是负载均衡,后面是服务器名称
filters:
- AddRequestHeader=Truth,xxx is freaking aowsome! #添加Truth请求头
要是想给所有的微服务请求都加上的话就这样
spring:
application:
name: gateway
cloud:
gateway:
routes:
- id: user-service # 路由唯一标识
# uri: http://127.0.0.1:8081 # 路由目标地址 固定地址
uri: lb://userService # 路由目标地址 lb就是负载均衡,后面是服务器名称
default-filters: # 默认filter,会对所有的路由请求生效
- AddRequestHeader=Truth,xxx is freaking aowsome!
全局过滤器 GlobalFilter
全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样。
区别在GatewayFilter通过配置定义,处理逻辑是固定的,而GlobalFilter的逻辑需要自己写代码实现。
案例 定义全局过滤,拦截并判断用户身份
这个是判断Filter执行顺序的,默认为2147483647(值越小,执行的优先级越高这里我们选择-1)
@Order(-1)
下面实现了param中出现authorization=admin则成功访问
/**
* @param exchange 请求上下文,里面可以获取Request,Response等信息
* @param chain 用来把请求委托给下一个过滤器
* return {@code Mono<Void>} 返回标示当前过滤器业务结束
*/
@Order(-1)
@Component
public class AuthorizeFilter implements GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//1. 获取请求参数
ServerHttpRequest request = exchange.getRequest();
MultiValueMap<String, String> params = request.getQueryParams();
//2. 获取参数中的 authorization
String auth = params.getFirst("authorization");
//3. 判断参数值是否等于 admin
if("admin".equals(auth)) {
// 4.是 放行
return chain.filter(exchange);
}
//5. 否 拦截
// 5.1 设置状态码
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
//5.2拦截请求
return exchange.getResponse().setComplete();
}
}
结果如下:
过滤器的执行顺序
- 每个过滤器都必须指定一个int类型的order值,order值越小,优先级越高,执行顺序越靠前。
- GlobalFilter通过实现Ordered接口或者添加@Order注解来指定order值,由我们自己指定
- 路由过滤器和defaultFilter的order由Spring指定默认是按照声明顺序默认递增。
- 当过滤器的orde值一样时,会按照defaultFilter > 路由过滤器 > GlobalFilter的顺序执行。
跨域问题处理
spring:
cloud:
gateway:
globalcors: # 全局的跨域处理
add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
corsConfigurations:
'[/**]':
allowedOrigins: # 允许哪些网站的跨域请求
- "http://localhost:8090"
- "http://www.leyou.com"
allowedMethods: # 允许的跨域ajax的请求方式
- "GET"
- "POST"
- "DELETE"
- "PUT"
- "OPTIONS"
allowedHeaders: "*" # 允许在请求中携带的头信息
allowCredentials: true # 是否允许携带cookie
maxAge: 360000 # 这次跨域检测的有效期