3 Filter/过滤器
文章目录
- 3 Filter/过滤器
- 1 GatewayFilter 使用 -- 路由过滤器
- 2 GatewayFilter 使用 -- 自定义过滤器
- 路由过滤器可用于修改进入的HTTP请求和返回的HTTP响应
- Spring Cloud Gateway 内置了多种路由过滤器,他们都由GatewayFilter的工厂类来产生
1 GatewayFilter 使用 – 路由过滤器
- 开发直接使用 GatewayFilter 较少,一般是自定义过滤器
第一步、修改e-commerce-gateway-20000 中的 application.yml
spring:
cloud:
gateway:
routes: #配置路由,可以有多个路由配置
- id: member_routh01 #路由的ID,程序员自己写,要求唯一
#gateway 最终访问的 url = uri+Path
#匹配后提供服务的路由地址,也可以是外网 uri,比如 http://www.baidu.com 等
#比如: 客户端/浏览器请求 url http://localhost:10000/member/get/1
#如果根据Path匹配成功 最终访问的url/转发url 就是 url=http://localhost:10000/member/get/1
#如果匹配失败,则有gateway返回404信息
#uri: http://localhost:10000
#1. lb:协议名,member-service-provider 注册到eureka server 服务名(小写)
#2. 默认情况下,负载均衡算法是轮询
uri: lb://member-service-provider
filters:
#过滤器工厂会在匹配的请求头加上一对请求头,名称为 color 值为 blue
- AddRequestParameter=color, green
#过滤器工厂会在匹配的请求头加上一对请求头,名称为 age 值为 20
- AddRequestParameter=age, 20
第二步、验证、修改member-service-provider-10000/…/MemberController.java
//查询的方法/接口
@GetMapping("/member/get/{id}")
public Result<Member> queryMemberById(@PathVariable("id") Long id, HttpServletRequest request) {
//路由过滤器
String color = request.getParameter("color");
String age = request.getParameter("age");
//模拟超时,这里暂停 5 秒
//try {
// TimeUnit.SECONDS.sleep(5);
//} catch (InterruptedException e) {
// e.printStackTrace();
//}
Member member = memberService.queryMemberById(id);
log.info("member={}", member);
if (member != null) {
// return Result.success("查询会员成功 member-service-provider-10000 " + color + age, member);
return Result.success("查询会员成功 member-service-provider-10000", member);
} else {
return Result.error("402", "ID=" + id + "不存在");
}
}
第三步、测试成功
2 GatewayFilter 使用 – 自定义过滤器
- 自定义全局 GlobalFilter 过滤器
- 如果请求参数 user=xjz , pwd=123 则放行, 否则不能通过验证
第一步、在e-commerce-gateway-20000 创建 filter/CustomGateWayFilter.java
package com.xjz.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;
//自定义 GlobalFilter
@Component
public class CustomGateWayFilter implements GlobalFilter, Ordered {
//filter是核心的方法,将我们过滤的业务,写在该方法中
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
System.out.println("==========CustomGateWayFilter=========");
//先获取到对应的参数值
//比如 http://localhost:20000/member/get/1?user=xjz&pwd=123
String user = exchange.getRequest().getQueryParams().getFirst("user");
String pwd = exchange.getRequest().getQueryParams().getFirst("pwd");
if (!("xjz".equals(user) && "123".equals(pwd))){
System.out.println("-----非法用户------");
exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);//回应
return exchange.getResponse().setComplete();
}
//验证通过,放行
return chain.filter(exchange);
}
/**
* order:表示该过滤器执行的顺序,数字越小,优先级越高
* @return
*/
@Override
public int getOrder() {
return 0;
}
}
第二步、测试结果
验证通过结果如下:
验证失败结果如下: