Zuul作为网关的其中一个重要功能,就是实现请求的鉴权。而这个动作我们往往是通过Zuul提供的过滤器来实现的。

一、过滤器方法的作用

想要使用Zuul实现过滤功能,我们需要自定义一个类继承ZuulFilter类,并实现其中的四个方法,我们先看一下这四个方法的作用是什么

public class MyFilter extends ZuulFilter {
/**
* filterType:返回字符串,代表过滤器的类型。包含以下4种:
* -- pre:请求在被路由之前执行
* -- route:在路由请求时调用
* -- post:在route和errror过滤器之后调用
* -- error:处理请求时发生错误调用
* @return 返回以上四个类型的名称
*/
@Override
public String filterType() {
return null;
} /**
* filterOrder:通过返回的int值来定义过滤器的执行顺序,数字越小优先级越高。
* @return
*/
@Override
public int filterOrder() {
return 0;
} /**
* shouldFilter:返回一个Boolean值,判断该过滤器是否需要执行。返回true执行,返回false不执行。
* @return
*/
@Override
public boolean shouldFilter() {
return false;
} /**
* run:编写过滤器的具体业务逻辑。
* @return
* @throws ZuulException
*/
@Override
public Object run() throws ZuulException {
return null;
}
}

二、自定义过滤器

我这里以pre类型演示

@Component
public class LoginFilter extends ZuulFilter { //过滤类型 pre route post error
@Override
public String filterType() {
return "pre";
} //过滤优先级,数字越小优先级越高
@Override
public int filterOrder() {
return 10;
} //是否执行run方法
@Override
public boolean shouldFilter() {
return true;
} //过滤逻辑代码
@Override
public Object run() throws ZuulException {
//获取zuul提供的上下文对象
RequestContext context = RequestContext.getCurrentContext();
//获取request对象
HttpServletRequest request = context.getRequest();
//获取请求参数
String token = request.getParameter("username");
//判断
if (StringUtils.isBlank(username)){
//过滤该请求,不对其进行路由
context.setSendZuulResponse(false);
//设置响应码401
context.setResponseStatusCode(HttpStatus.SC_UNAUTHORIZED);
//设置响应体
context.setResponseBody("request error....");
}
// 校验通过,把登陆信息放入上下文信息,继续向后执行
context.set("username",username);
return null;
}
}

没添加过滤功能之前是这样的 ↓,无论加不加username都可以得到数据

添加了过滤功能之后是这样的 ↓,只有加了username才能访问

F12打开控制台,发现响应了401

三、过滤器执行的声明周期

  • 正常流程:

    • 请求到达首先会经过pre类型过滤器,而后到达route类型,进行路由,请求就到达真正的服务提供者,执行请求,返回结果后,会到达post过滤器。而后返回响应。
  • 异常流程:

    • 整个过程中,pre或者route过滤器出现异常,都会直接进入error过滤器,在error处理完毕后,会将请求交给POST过滤器,最后返回给用户。
    • 如果是error过滤器自己出现异常,最终也会进入POST过滤器,将最终结果返回给请求客户端。
    • 如果是POST过滤器出现异常,会跳转到error过滤器,但是与pre和route不同的是,请求不会再到达POST过滤器了。

最新文章

  1. [knowledge][basic][hardware] 内存的硬件结构(转)
  2. SQL学习指南 ——笔记
  3. 在IIS8添加WCF服务支持
  4. WCF使用小结:(1)WCF接收HTTP POST数据的处理方法
  5. MyEclipse for Spring启动时报错"An internal error occurred during: 'Updating indexes'.Java heap space"的解决办法
  6. [C语言](一)第一个Windows 32 API的窗口程序
  7. Codeforces Round #189 (Div. 1) B. Psychos in a Line 单调队列
  8. sqlserver2008 解决 ldf文件过大的方法
  9. 食品药检所LIMS需求分析说明书
  10. Unity3d 项目管理 版本管理
  11. 随机生成器、thread(暂停)、清屏定义
  12. OpenCV成长之路:图像直方图
  13. Android学习笔记View的工作原理
  14. 小解系列-自关联对象.Net MVC中 json序列化循环引用问题
  15. 使用foreach需要判空。
  16. Delphi全局热键的注册
  17. Vue(十六)vue-router路由
  18. python第九十五天--js正则
  19. 五分钟搞清楚MySQL事务隔离级别
  20. react父转子

热门文章

  1. Apache中Cookie长度的设置 414 request-uri too large apache
  2. Vue中Form表单验证无法消除验证问题
  3. webPack 4.0的零基础学习
  4. [考试反思]1003csp-s模拟测试58:沉淀
  5. 详解SpringBoot应用跨域访问解决方案
  6. 在vue中如何使用axios
  7. P5304旅行者(比bk201还要流氓的解法)
  8. python购物车练习题
  9. 1114作业 html
  10. beacon帧字段结构最全总结(三)——VHT字段总结