7、Filter的使用
7.1、是什么
路由过滤器可用于修改进入的HTTP请求和返回的HTTP响应,路由过滤器只能指定路由进行使用。
Spring Cloud Gateway 内置了多种路由过滤器,他们都由GatewayFilter的工厂类来产生
-
Spring Cloud Gateway的Filter
-
生命周期,Only Two
- pre
- post
-
种类,Only Two
-
GatewayFilter
https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/#the-addrequestparameter-gatewayfilter-factory
31种之多。。。。。
-
-
GlobalFilter
-
-
常用的GatewayFilter
-
AddRequestParameter
YML
server: port: 9588 spring: application: name: cloud-gateway cloud: gateway: discovery: locator: enabled: true #开启从注册中心动态创建路由的功能 lower-case-service-id: true #使用小写服务名,默认是大写 routes: - id: payment_routh #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名 uri: lb://cloud-provider-payment #匹配后的目标服务地址,供服务的路由地址 #uri: http://localhost:8001 #匹配后提供服务的路由地址 filters: - AddRequestParameter=X-Request-Id,1024 #过滤器工厂会在匹配的请求头加上一对请求头,名称为X-Request-Id值为1024 predicates: - Path=/payment/lb/** # 断言,路径相匹配的进行路由 - Method=GET,POST eureka: instance: hostname: cloud-gateway-service client: #服务提供者provider注册进eureka服务列表内 service-url: register-with-eureka: true fetch-registry: true defaultZone: http://eureka7001.com:7001/eureka
-
省略
-
7.2、自定义过滤器
自定义全局GlobalFilter
-
两个主要接口介绍 implements GlobalFilter,Ordered
-
能干嘛
全局日志记录、统一网关鉴权。。。。。。。。
-
案例代码
package com.likun.springcloud.filter; import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.core.Ordered; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; /** * @author likun * @create 2021-04-30 23:25 */ @Component//必须加,必须加,必须加 public class MyLogGatWayFilter implements GlobalFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { String uname = exchange.getRequest().getQueryParams().getFirst("uname"); if (uname == null) { System.out.println("*******对不起,用户名为null,无法登录"); exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE); return exchange.getResponse().setComplete(); } else { return chain.filter(exchange); } } @Override public int getOrder() { return 0; } }
-
测试
正确:http://localhost:9527/payment/lb?uname=lk
错误:http://localhost:9527/payment/lb
(完)