您现在的位置是:首页 >技术教程 >SpringCloud GateWay-Filter学习网站首页技术教程

SpringCloud GateWay-Filter学习

xjz_2002 2024-07-20 12:01:04
简介SpringCloud GateWay-Filter学习

3 Filter/过滤器

  • 路由过滤器可用于修改进入的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 + "不存在");
        }
    
}

第三步、测试成功

image-20230602214233733

2 GatewayFilter 使用 – 自定义过滤器

  1. 自定义全局 GlobalFilter 过滤器
  2. 如果请求参数 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;
    }
}

第二步、测试结果

验证通过结果如下:

image-20230602214955768

验证失败结果如下:

image-20230602215220647

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。