首页 > 其他分享 >全局过滤器------GlobalFilter

全局过滤器------GlobalFilter

时间:2023-06-18 23:23:07浏览次数:40  
标签:return 请求 chain exchange 过滤器 GlobalFilter ------

前言
SpringCloud的网关提供了31中过滤器,但这些过滤器作用都是固定的。如果我们希望拦截请求,做自己的业务逻辑就需要用到全局过滤器。

全局过滤器作用
全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样。区别在于GatewayFilter通过配置定义,处理逻辑是固定的;而GlobalFilter的逻辑需要自己写代码实现。
实现方式是定义GlobalFilter接口。

点击查看代码
public interface GlobalFilter {
    /**
     *  处理当前请求,有必要的话通过{@link GatewayFilterChain}将请求交给下一个过滤器处理
     *
     * @param exchange 请求上下文,里面可以获取Request、Response等信息
     * @param chain 用来把请求委托给下一个过滤器 
     * @return {@code Mono<Void>} 返回标示当前过滤器业务结束
     */
    Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain);
}
在filter中编写自定义逻辑,可以实现下列功能:
  • 登录状态判断
  • 权限校验
  • 请求限流等

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

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

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

点击查看代码
@Order(-1)
@Component
public class AuthorizeFilter implements GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 1.获取请求参数
        MultiValueMap<String, String> params = exchange.getRequest().getQueryParams();
        // 2.获取authorization参数
        String auth = params.getFirst("authorization");
        // 3.校验
        if ("admin".equals(auth)) {
            // 放行
            return chain.filter(exchange);
        }
        // 4.拦截
        // 4.1.禁止访问,设置状态码
        exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);
        // 4.2.结束处理
        return exchange.getResponse().setComplete();
    }
}
放行:return chain.filter(exchange);

结束处理:return exchange.getResponse().setComplete();

注解解释:
@Order(-1):该注解的作用是对过滤器的执行顺序做一个排序,默认值是2147483647。里面的值越小,执行的顺序越靠前。除此之外还可以实现GlobalFilter接口,重写里面的getOrder()方法,返回一个int类型的值即可。

标签:return,请求,chain,exchange,过滤器,GlobalFilter,------
From: https://www.cnblogs.com/wzh-Official/p/17489988.html

相关文章

  • std::thread 四:异步(async)
     *:如果std::async中传递参数std::lunnch::deferred,就需要等待调用get()或者wait()才会执行,并且代码非子线程运行,而是在主线程中执行 #include<iostream>#include<thread>#include<mutex>#include<list>#include<future>usingnamespacestd;intmyThre......
  • std::thread 五:打包任务(packaged_task)
     #include<iostream>#include<thread>#include<mutex>#include<list>#include<future>usingnamespacestd;intmyThread(intnum){cout<<"myThread()startthreadid="<<this_thread::get_i......
  • 万能欧几里得
    之前有个题是类欧求floorsum,感觉素质不是很高。后来又有个题是万欧,这下这下了。考虑这样一个事情:我们有一个向量\(v\),考虑有一条线段\(y=\frac{ax+b}{c}\),其中\(a,b,c\)均为自然数且\(c\gt0\),定义域为\((0,n]\)。注意是右闭左开的。这条线段随着\(x\)的增加,当碰......
  • DisableThreadLibraryCalls与DLLMain死锁
    DisableThreadLibraryCalls与DLLMain死锁 1、首先写个简单的DLL,用来验证1234567891011121314151617181920212223242526272829303132BOOL APIENTRYDllMain( HMODULE hModule,                       ......
  • std::thread 一:创建线程的三种方式
    前言:#include<thread>thread.join()//阻塞thread.detach()//非阻塞thread.joinable()//bool,判断线程是否支持join或者detach 正文:创建线程有三种方式,分别是:使用函数来创建线程、使用自定义的类来创建线程、使用lambda函数来创建线程 一、使用函数来......
  • 六神
    笔记六神对六亲有信息补充的作用(第9课),即对六亲有信息限定,缩小范围的作用。排六神看第24课。六神和季节月份方位五行干支关系图为基础知识(第21课)。六神有不同的颜色、温度、性格特点,能使信息变得生动形象。活用六神是提高六神水平的重要基础。【六神主要特点总结】雀司言,武司......
  • day 33 反射机制,元类,__new__,__call__,元类下的属性查找
    1,内置方法在满足某种条件下自动触发 2、python是动态,强类型的,解释型语言动态:在程序中定义变量时不需要定义变量的类型,在执行时才知道变量的类型;静态:必须定义好变量的类型。只要是动态语言,就必须有反射机制 解释:一句一句的翻译后执行强类型:3:反射实现反射机制的步骤1、......
  • [转载]常见UML图
    转自公众号:UML科普文,一篇文章掌握14种UML图什么是UML?UML是UnifiedModelLanguage的缩写,中文是统一建模语言,是由一整套图表组成的标准化建模语言。为什么要用UML?通过使用UML使得在软件开发之前,对整个软件设计有更好的可读性,可理解性,从而降低开发风险。同时,也能方便各个开......
  • std::thread 二:互斥量(lock() & unlock())
     mutex 互斥量的作用是保护共享数据*:有lock() 就一定要有 unlock()#include<iostream>#include<thread>#include<mutex>#include<list>usingnamespacestd;classA{public:voidinNum(){for(inti=0;i<10000;i++)......
  • test
    #include<librealsense2/rs.hpp>#include<opencv2/opencv.hpp>#include<thread>voidcapture_thread(rs2::pipelinepipe,rs2::frame_queue&queue){while(true){rs2::framesetframeset=pipe.wait_for_frames();queue.e......