• 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 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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    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 + "不存在");
            }
    
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    测试

    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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    测试

    ​ 启动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连支持一下,创造不易您们的支持是我的动力🤞

  • 相关阅读:
    Windows ADK使用场景之一:应用程序兼容性工具。解决普通域用户执行软件时,提示要管理员账号与密码问题!
    Android + Bmob 实现用户注册登录
    静态时序分析-OCV和time derate
    电脑文件误删除如何恢复?
    【编程题】【Scratch二级】2021.03 两座对称的山峰
    【MySql】mysql之用户管理
    究竟是什么在决定着我们的命运?
    Java设计模式之适配器模式
    SpringBoot-运维实用篇复习(全)
    day05-SpringBootWeb请求响应
  • 原文地址:https://blog.csdn.net/m0_73557631/article/details/133495831