说一下zuul网关的过滤器

zuul网关的过滤器工作示意图:

在这里插入图片描述
这是个完整的过滤器图,我们可以看到,一开始先由HTTP也就是客户那边发送请求过来,然后第一次是要经过预先的过滤器也就是:“pre”过滤器,过滤掉一些没有意义的信息和进行客户验证,然后再经由路由过滤器进行分发任务,在原始服务器中找到对应的服务来提供信息,然后再发送到响应过滤器,这时,响应过滤器就会接收这些信息,然后发送响应数据给客户端,让客户能够接收到,但是如果在出错的情况下,路由过滤器会直接发送错误信息到错误过滤器,错误过滤器知道这是个错误了,就会通知响应过滤器做出反应给客户。

然后再说说过滤器
在这里插入图片描述
这是网关过滤器的配置,第一个方法就是规定过滤器的String类型,过滤器是什么类型的,比如前置过滤器, 路由过滤器,响应过滤器,你是什么类型的过滤器,他就会用String的方式去记住你,第二个是顺序过滤器,他采用的是int类型,也就是int的数值越小,优先执行的级别就越高,前置过滤器比路由过滤器要小,然而如果前置里面也有十个过滤器,那么在它们的内部也会有更小int值的获取更高的优先执行权。

在这里插入图片描述
我们该如何建立一个过滤器呢?首先我们找到zuul网关模块,然后去new一个登录的过滤器,并且要记得去继承过滤器的方法(所有的过滤器都要去继承ZuulFilter这个方法),然后去select Methods
在这里插入图片描述
为什么我们要选择这四个方法呢?第一第二个应该很好理解,就是我们刚刚说的定义过滤器的执行顺序,还有过滤器的类型是什么(像我们这里就是登录的过滤器),下面两个的意思就是我们应不应该去执行这个过滤器,还有就是运行过滤器的启动按钮。

在这里插入图片描述
在继承方法过后,我们就可以重新写一下这些方法,第一个是定义过滤器的名字,第二个是定义过滤器的执行等级,第三个应该返回的是true,代表着应不应该开启过滤器。

在这里插入图片描述
最后这个run的方法重点讲一下,这个过滤器的重点就是在这个方法里面,这个是过滤器的执行方法,也就是过滤器的业务逻辑,你希望这个过滤器去实现什么功能,你就需要在这个run方法里面编写什么内容,因为我们这个过滤器是针对登录方法的过滤器,所以配置一个RequestContext方法去初始化context上下文,这个是什么意思呢,也就是用户给你发送请求下来,你是不是要去接收用户的请求对吧?然后你必须把你反馈给用户的信息初始化一下,还有发送给后台的信息也是要初始化一下,这相当于叫他们两头都准备好,等我审核了信息之后,你们再做决定的意思。

然后我们要去获取请求,该如何去获取请求呢,就可以用HttpServletRequest去保存请求,因为这个请求是用户发送过来的,所以我们只需要在初始化后的context接收用户发送过来的请求即可

然后我们需要在请求里面去获取这个参数,转换为String类型,最后要做出判断,这个请求是不是一个空请求,因为上面我们已经把这个请求转换为String类型的了,因此,我们可以用StringUtils这个方法去检查内容是否为空(以后凡是检查String类型的内容是不是为空,都可以用StringUtil方法去检查,这个StringUtil方法不仅可以检查内容是否为空,还可以检查很多关于文字类信息的类型并作出判断,具体你可以去查看它的方法内容就行),如果为空的化,context就关闭发送方法

在这里插入图片描述
除此之外,我们还可以加上状态码在context里面,这个状态码是unauthorized也就是未认证的意思,报的是401错误,然后可以返回响应体-----》请求错误。这里要说一个细节,就是setSendzuulResponse这个方法是一个boolean方法,判断你是否通过了网关过滤后然后要发送给后台微服务,如果你选择false,那就是关闭了向后面的服务进行发送

setResponseBody就是决定你响应给前台信息什么内容,为什么是ResponseBody呢?因为这个是响应体,我们之前在controller里面经常会看见这个响应体,这个响应体是针对网页前端进行显示的响应体,也就是发送给客户请求的一个响应

上面说的两个细节就是两个对比,一个是跟发送给后台相关的,一个是发送给前台相关的,然而都是由过滤器进行控制。

最终这个run方法还有一点就是最后return的值
在这里插入图片描述
它return的是一个null,这就代表最终这个过滤器执行逻辑到最后是没有做出任何方法的

在这里插入图片描述
最后我们还需要注意把这整个过滤器的方法放入到Spring里面

在这里插入图片描述
最终我们可以执行一下,可以看到,只要添加了token=任意值,这个页面就会被成功加载。

这是什么原理呢,这里来总结一下先:

首先你要知道拦截器是怎么工作的,为什么我们最后添加了null它还是能工作。因为拦截器顾名思义就是拦截东西的,如果你这个东西是正常的,它是不是就要放你通行,是吧?所以我们的方法最后返回值是null,因为你输入正确的,我拦截器也不进行拦截了,直接返回一个null值,也就代表不进行任何拦截操作。

但是如果我们不输入token,那会有什么后果呢?

在这里插入图片描述
会出现返回这个提示

因为我们前面方法也提到了,我们写了一个去接收请求的方法,并且String了这个请求方法,用StringUtils去判断这个方法是不是为空,如果为空,拦截器将会进行拦截,再看看上图,我们没写token方法,也就是token为空,这就启动了拦截器。

所以这就是过滤器的工作原理(拦截器过滤器其实一样,只不过我后来顺手打成了拦截器)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值