路由过滤器GatewayFilter
GatewayFilter:是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理:
过滤器工厂 GatewayFilterFactory,Spring提供了31种不同的路由过滤器工厂。
例:给所有进入userservice的请求添加一个请求头:Truth=itcast is freaking awesome!
server: port: 10010 spring: application: name: gateway cloud: nacos: server-addr: localhost:8848 # nacos地址 gateway: routes: - id: user-service #路由标记,必须唯一 uri: lb://userservice #路由目标地址 lb:loadBalance predicates : #判断请求是否符合规则 - Path=/user/** #路由断言,判断路径是否是以user开头,如果是则符合 - id: order-service uri: lb://orderservice predicates: - Path=/order/** # - After=2037-01-20T17:42:47.789-07:00[Asia/Shanghai] #时间必须在2037年之后 filters: #过滤器 - AddRequestHeader=Truth, Itcast is freaking awesome! # 添加请求头
默认过滤器:
default-filters: # 默认过滤器,会对所有的路由请求都生效
- AddRequestHeader=Truth, Itcast is freaking awesome! # 添加请求头
全局过滤器GlobalFilter:
全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样。 区别在于GatewayFilter通过配置定义,处理逻辑是固定的。而GlobalFilter的逻辑需要自己写代码实现。
定义方式是实现GlobalFilter接口。
需求:定义全局过滤器,拦截请求,判断请求的参数是否满足下面条件:
1、参数中是否有authorization,
2、authorization参数值是否为admin
如果同时满足则放行,否则拦截
package cn.itcast.gateway; import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; import org.springframework.http.HttpStatus; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.stereotype.Component; import org.springframework.util.MultiValueMap; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; //@Order(-1) //过滤器的优先级,执行顺序,越小优先级越高 @Component public class AuthorizeFilter implements GlobalFilter, Ordered { @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(auth.equals("admin")){ //4、是则放行 return chain.filter(exchange); } //5、否,拦截 //5.1、设置状态码 exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); //5.2、拦截请求 return exchange.getResponse().setComplete(); } //设置优先级 @Override public int getOrder() { return -1; } }
全局过滤器的作用是什么?
对所有路由都生效的过滤器,并且可以自定义处理逻辑
实现全局过滤器的步骤?
实现GlobalFilter接口
添加@Order注解或实现Ordered接口
编写处理逻辑