GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理:
Spring提供了31种不同的路由过滤器工厂。例如:
名称 说明
AddRequestHeader 给当前请求添加一个请求头
RemoveRequestHeader 移除请求中的一个请求头
AddResponseHeader 给响应结果中添加一个响应头
RemoveResponseHeader 从响应结果中移除有一个响应头
RequestRateLimiter 限制请求的流量
实例:给所有进入userservice的请求添加一个请求头
给所有进入userservice的请求添加一个请求头:Truth=itcast is freaking awesome!
1.局部过滤器
实现方式:在gateway中修改application.yml文件,给userservice的路由添加过滤器:
spring:
gateway:
routes:
- id: user-service # 路由标示,必须唯一
uri: lb://userservice # 路由的目标地址
predicates: ## 路由断言,也就是判断请求是否符合路由规则的条件
- Path=/user/** # 路径断言,判断路径是否是以/user开头,如果是则符合
filter:
- AddRequestHeader=Truth,zhangsan is freaking awesome! #添加请求头
2.默认过滤器
如果要对所有的路由都生效,则可以将过滤器工厂写到default下。格式如下:
spring:
gateway:
routes:
- id: user-service # 路由标示,必须唯一
uri: lb://userservice # 路由的目标地址
predicates: ## 路由断言,也就是判断请求是否符合路由规则的条件
- Path=/user/** # 路径断言,判断路径是否是以/user开头,如果是则符合
#filter:
# - AddRequestHeader=Truth,zhangsan is freaking awesome! #添加请求头
- id: order-service
uri: lb://orderservice
predicates:
- Path=/order/**
- Before=2037-01-20T17:42:47.789-07:00[Asia/Shanghai]
#- After=2037-01-20T17:42:47.789-07:00[Asia/Shanghai]
default-filters:
- AddRequestHeader=Truth,lisi is freaking awesome! #添加请求头
@RestController
@RequestMapping("order")
public class OrderController {
@Autowired
private OrderService orderService;
@GetMapping("{orderId}")
public Order queryOrderByUserId(@PathVariable("orderId") Long orderId,
@RequestHeader(value = "Truth", required = false) String truth) {
System.out.println("truth: " + truth);
// 根据id查询订单并返回
return orderService.queryOrderById(orderId);
}
}
总结:
过滤器的作用是什么?
a.对路由的请求或响应做加工处理,比如添加请求头
b.配置在路由下的过滤器只对当前路由的请求生效
defaultFilters的作用是什么?
a.对所有路由都生效的过滤器