Filter/过滤器基本使用

😀前言
本篇博文是关于Filter/过滤器基本使用,希望你能够喜欢

🏠个人主页:晨犀主页
🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力😉😉

💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,感谢大家的观看🥰
如果文章有什么需要改进的地方还请大佬不吝赐教 先在此感谢啦😊

SpringCloud Gateway

Filter/过滤器

基本介绍

  1. 文档地址:
    https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/#gatewayfilter-factories

image-20230828213649847

解读

  1. 路由过滤器可用于修改进入的HTTP请求和返回的HTTP响应。
  2. Spring Cloud Gateway 内置了多种路由过滤器,他们都由GatewayFilter的工厂类来产生

类型

GatewayFilter

image-20230828213754066

GlobalFilter
  1. 文档地址:
    https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/#global-filters

image-20230828213823398

GatewayFilter 使用

​ 开发直接使用GatewayFilter 较少,一般是自定义过滤器

参考实例
  1. 参考文档地址:
    https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/#the-addrequestheader-gatewayfilter-factory

image-20230828213907103

  1. 修改e-commerce-gateway-20000 的application.yml
      routes: #配置路由,可以配置多个路由 List<RouteDefinition> routes
        - id: member_route01 #路由的id, 程序员自己配置,要求唯一
          #gateway 最终访问的url 是 url=uri+Path
          #匹配后提供服务的路由地址: 也可以是外网 http://www.baidu.com
          #比如: 客户端/浏览器请求 url http://localhost:20000/member/get/1
          #如果根据Path匹配成功 最终访问的url/转发url 就是 url=http://localhost:10000/member/get/1
          #如果匹配失败, 则有gateway返回404信息
          #疑问: 这里配置的 uri 是固定,在当前这种情况其实可以没有有Eureka Server,后面会使用灵活方式
          #     配置,就会使用到Eureka Server
          #uri: http://localhost:10000
          #解读
          #1. lb: 协议名 , member-service-provider 注册到eureka server 服务名(小写)
          #2. 默认情况下,负载均衡算法是轮询
          uri: lb://member-service-provider
          filters:
            - AddRequestParameter=color, blue #过滤器工厂会在匹配的请求头加上一对请求头,名称为color 值为blue
            - AddRequestParameter=age, 18 #过滤器工厂会在匹配的请求头加上一对请求头,名称为age 值为18
          predicates: #断言,可以有多种形式
            - Path=/member/get/**
  1. 验证, 修改D:\my_springcloud\e-commerce-center\member-service-provider-10000\src\main\java\com\my\springcloud\controller\MemberController.java
//查询的方法/接口
    //这里使用url占位符+@PathVariable
    @GetMapping("/member/get/{id}")
    public Result getMemberById(@PathVariable("id") Long id, HttpServletRequest request) {

        String age = request.getParameter("age");
        String address = request.getParameter("address");
        //模拟超时, 休眠5s
        //try {
        //    TimeUnit.MILLISECONDS.sleep(5000);
        //} catch (InterruptedException e) {
        //    e.printStackTrace();
        //}

        Member member = memberService.queryMemberById(id);

        //使用Result把查询到的结果返回
        if (member != null) {
            return Result.success("查询会员成功 member-service-provider-10000 " + address + "-" + age , member);
        } else {
            return Result.error("402", "ID= " + id + "不存在");
        }

    }
测试

image-20230828214426295

自定义GlobalFilter

需求分析/图解
  1. 自定义全局GlobalFilter 过滤器
  2. 如果请求参数user=hhh, pwd=123456 则放行, 否则不能通过验证
代码实现
  1. 在e-commerce-gateway-20000 创建com/my/springcloud/filter/CustomGateWayFilter.java
@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=hhh&pwd=123456
        String user =
                exchange.getRequest().getQueryParams().getFirst("user");
        String pwd = exchange.getRequest().getQueryParams().getFirst("pwd");
        if(!("hhh".equals(user) && "123456".equals(pwd))) {//如果不满足条件
            System.out.println("-----非法用户-----");
            exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);//回应
            return exchange.getResponse().setComplete();
        }
        //验证通过, 放行
        return chain.filter(exchange);
    }


    //order 表示过滤器执行的顺序, 数字越小, 优先级越高
    @Override
    public int getOrder() {
        return 0;
    }
}
测试

​ 启动e-commerce-eureka-server-9001
​ 启动member-service-provider-10000/10002
​ 启动e-commerce-gateway-20000
​ 浏览器:(通过网关访问) http://localhost:20000/member/get/1?user=hhh&pwd=123456

image-20230828214948750image-20230828215157567

文章到这里就结束了,如果有什么疑问的地方请指出,诸大佬们一起来评论区一起讨论😁
希望能和诸大佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晨犀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值