• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

微服务框架 SpringCloud微服务架构 8 Gateway 网关 8.5 全局过滤器

武飞扬头像
Ding Jiaxiong
帮助1

微服务框架

【SpringCloud RabbitMQ Docker Redis 搜索 分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】

SpringCloud微服务架构

8 Gateway 网关

8.5 全局过滤器

8.5.1 全局过滤器 GlobalFilter

全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样。

【这个跟default 不是一样的吗?】

区别在于GatewayFilter通过配置定义,处理逻辑是固定的。而GlobalFilter的逻辑需要自己写代码实现。

定义方式是实现GlobalFilter接口

学新通

【行吧】

8.5.2 案例

定义全局过滤器,拦截并判断用户身份

需求:定义全局过滤器,拦截请求,判断请求的参数是否满足下面条件:

  • 参数中是否有authorization,
  • authorization参数值是否为admin

如果同时满足则放行,否则拦截

直接开干!

先来一个过滤器类

package cn.itcast.gateway;

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.util.MultiValueMap;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

/**
 * ClassName: AuthorizeFilter
 * date: 2022/10/29 16:56
 *
 * @author DingJiaxiong
 */

//@Order(-1) //过滤器执行顺序,越小优先级越高
@Component
public class AuthorizeFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {

        //1. 获取请求参数
        ServerHttpRequest request = exchange.getRequest();
        MultiValueMap<String, String> params = request.getQueryParams();
        //2. 获取参数中的authorization 参数

        String auth = params.getFirst("authorization");

        //3. 判断参数值是否等于admin
        if ("admin".equals(auth)){
            //4. 是,放行
            return chain.filter(exchange);
        }

        //5. 否,拦截
        //5.1 设置状态码
        exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
        //5.2 拦截请求
        return exchange.getResponse().setComplete();

    }

    @Override
    public int getOrder() {
        return -1; //这样也是一样的道理,设置过滤器优先级
    }
}

OK,这样过滤器就算定义好了,直接重启网关服务

学新通

OK,直接测试

学新通

可以看到直接访问,就是401

加上参数

学新通

没毛病

试试错误的参数

学新通

也是401 ,没毛病!

学新通

8.5.3 总结
  • 全局过滤器的作用是什么?

对所有路由都生效的过滤器,并且可以自定义处理逻辑

  • 实现全局过滤器的步骤?

①实现GlobalFilter接口

②添加@Order注解或实现Ordered接口【过滤器一定要有顺序、不然执行结果可能会和预想的不一样】

③编写处理逻辑

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhggbfec
系列文章
更多 icon
同类精品
更多 icon
继续加载