各个微服务的访问需要网关统一管理进行跳转,而在访问网关时,我们可以进行增强功能,通过过虑器实现请求过虑,身份校验

等。

/*** 身份校验过滤器*/
@Component
public class LoginFilter extends ZuulFilter {@AutowiredAuthService authService;/*** 过滤器类型 4种*  pre:请求在被路由之前*  执行routing:在路由请求时调用*  post:在routing和errror过滤器之后调用*  error:处理请求时发生错误调用* @return*/@Overridepublic String filterType() {//return null 会导致 FilterProcessor - null异常return "pre";}/*** 过滤器序号* 越小越优先被执行* @return*/@Overridepublic int filterOrder() {return 0;}//是否执行过滤器@Overridepublic boolean shouldFilter() {//返回true表示执行此过滤器return true;}//过滤器得内容//过虑所有请求,判断头部信息是否有Authorization,如果没有则拒绝访问,否则转发到微服务。@Overridepublic Object run() throws ZuulException {RequestContext requestContext = RequestContext.getCurrentContext();//得到requestHttpServletRequest request = requestContext.getRequest();HttpServletResponse response = requestContext.getResponse();//cookieString tokenFormCookie = authService.getTokenFormCookie();if(StringUtils.isEmpty(tokenFormCookie)){access_denied();return null;}//hearString tokenFormHeader = authService.getTokenFormHeader(request);if(StringUtils.isEmpty(tokenFormHeader)){access_denied();return null;}//redislong expireFormRedis = authService.getExpireFormRedis(tokenFormCookie);if(expireFormRedis<0){access_denied();return null;}return null;}//拒绝访问private void access_denied(){RequestContext requestContext = RequestContext.getCurrentContext();//得到requestHttpServletRequest request = requestContext.getRequest();HttpServletResponse response = requestContext.getResponse();//拒绝访问requestContext.setSendZuulResponse(false);//回复响应requestContext.setResponseStatusCode(200);ResponseResult responseResult = new ResponseResult(CommonCode.UNAUTHENTICATED);String s = JSON.toJSONString(responseResult);requestContext.setResponseBody(s);response.setContentType("application/json;charset=utf-8");}}

@service

@Service
public class AuthService {@AutowiredStringRedisTemplate stringRedisTemplate;//从cookie中获取jwt令牌public String getTokenFormCookie() {HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();Map<String, String> map = CookieUtil.readCookie(request, "uid");if(map!=null&&map.get("uid")!=null){return map.get("uid");}return null;}//从请求头中获取jwt令牌public String getTokenFormHeader(HttpServletRequest request) {String authorization = request.getHeader("Authorization");if(StringUtils.isEmpty(authorization)){return null;}if(!authorization.startsWith("Bearer ")){return null;}String jwt = authorization.substring(7);return jwt;}//从redis获取过期时间public long getExpireFormRedis(String access_token){String key ="user_token:" + access_token;Long expire = stringRedisTemplate.getExpire(key, TimeUnit.SECONDS);return expire;}
}

可以从代码中看到,我们LoginFilter继承ZuulFilter后实现4个子方法,分别是1.过滤器的类型(处理时机), 2.此过滤器的优先级 3.是否执行此过滤器 4.过滤器的内容。

我们实现了一个在请求被路由之前的身份验证功能,在4中获取request中的

1.判断request中的cookie是否有jwt身份短令牌,没有则拒绝访问

2.判断request的Header中是否有jwt令牌,没有则拒绝访问

3.判断redis中此令牌是否过期,过期则拒绝访问

最后,都满足则路由跳转至指定微服务,不满足则response返回未登录授权异常

ZuulFilter的使用场景相关推荐

  1. ZuulFilter方法简介

    一.ZuulFilter public abstract ZuulFilter implements IZuulFilter{abstract public String filterType();a ...

  2. ZuulFilter过滤器

    文章目录 1.过滤器 1.1 ZuulFilter 1.2 过滤器执行生命周期 1.3 使用场景 2.自定义过滤器 2.1 定义过滤器类 2.2 测试 Zuul作为网关的其中一个重要功能,就是实现请求 ...

  3. 自定义ZuulFilter用于验证生成的token

    问题背景 微服务体系,一般都是把安全验证做再网关层面的.而一般zuul跟shiro或者spring security的集成会比较好. 但是,有时候公司的业务场景并不复杂,根本无需复杂的架构,那么手写一 ...

  4. 咖啡汪日志 —— 一文看懂Spring Cloud 网关ZuulFilter的使用和源码(包括FilterFactory 的讲解)

    作为乐死不疲的汪界翘楚 本汪每天不是在戏精 就是在戏精的路上了 作为一只纯种哈士奇 玩,就要玩得尽兴而归! 今天与大家一起溜溜,看看 Spring Cloud 网关 ZuulFilter ,从使用到源 ...

  5. Spring-Cloud 微服务网关Zuul、ZuulFilter过滤器和限流

    微服务网关 一. Zuul网关 1. 创建工程 并导入依赖 2. application.yml 配置文件 3. 启动类添加注解 4. 依次启动服务 5. 进入浏览器访问测试 二. ZuulFilte ...

  6. 网关的其中一个重要功能,就是实现请求的鉴权:zuulFilter

    Zuul作为网关的其中一个重要功能,就是实现请求的鉴权.而这个动作我们往往是通过Zuul提供的过滤器来实现的. ZuulFilter ZuulFilter是过滤器的顶级父类.在这里我们看一下其中定义的 ...

  7. Spring Cloud Zuul之ZuulFilter详解

    简介 Spring Cloud Zuul网关在整个微服务体系中肩负对外开放接口.请求拦截.路由转发等作用,其核心处理则是ZuulFilter ZuulFilter部分源码 Zuul Filter全部继 ...

  8. @Transactional注解最容易忽视的三个失效场景!

    @Transactional注解在以下场景中使用,是会失效的,切记! 1.非public方法 spring对注解事务的方法进行校验,修饰符是不是public,不是 public则不会获取@Transa ...

  9. 2022-2028年中国场景金融行业深度调研及投资前景预测报告

    [报告类型]产业研究 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了场景金融行业相关概述.中国场景金融行业运行环境.分析了中国场景金融行 ...

最新文章

  1. 大数据可视化模板_最佳大数据可视化技术
  2. html 页面过度效果,HTML页面过渡效果大全
  3. 关于Delphi中TRttiContext.FindType失效的问题
  4. 云原生 DevOps,模型化应用交付能力很重要
  5. Zabbix 钉钉报警
  6. 随想录(三言两语app)
  7. Windows多屏开发小记
  8. 判断DataTable为空,获取值,查询数据,datarow转datatable
  9. 移动端高保真动态交互元件库+移动端通用元件库+app通用元件库+rpllib元件库+rp源文件+Axure移动端常用组件+数据展示+操作反馈+数据录入+列表页+表单页+通用版布局+业务组件+反馈组件
  10. 解决手机邮箱登录学生邮箱时服务器无法连接的问题
  11. java 网页录音并上传_Java+FlashWavRecorder实现网页录音并上传
  12. 计算机系军训口号四句霸气,军训口号 四句 霸气
  13. excel更改日期格式无效_Excel日期不会更改格式
  14. uniapp上传、预览、删除图片
  15. 抓包那些事——四大抓包神器简介
  16. android 进度条边框,android用户界面-组件Widget-进度条ProgressBar
  17. lr_convert_string_encoding: 对中文进行UTF-8转码
  18. 科学出版社计算机七年级上,科学出版社七年级信息技术下册教案.doc
  19. Linux C/C++或者嵌入式开发到底有没有35岁危机?
  20. 在CorelDraw中,VBA宏调用是如何执行的?

热门文章

  1. 微机原理换行代码_微机原理课程设计——汇编输出杨辉三角
  2. spss多元非线性曲线拟合_快速掌握SPSS数据分析
  3. 360手机浏览器_网信办:UC、QQ、360、搜狗等8款手机浏览器被纳入首批整治范围...
  4. java实现从键盘上输入学生考试的科目和学生的每科分数,输出总分、最高分、最低分、平均分
  5. 命令行安装Pillow
  6. Redis Spring集成
  7. 鼠标悬浮改变背景颜色
  8. python基础(14)之 类和对象
  9. oracle11 处理器数,11G AWR中%Total CPU与%Busy CPU指标的疑问
  10. Python 小白从零开始 PyQt5 项目实战(1)安装与环境配置