ZuulFilter的使用场景
各个微服务的访问需要网关统一管理进行跳转,而在访问网关时,我们可以进行增强功能,通过过虑器实现请求过虑,身份校验
等。
/*** 身份校验过滤器*/
@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的使用场景相关推荐
- ZuulFilter方法简介
一.ZuulFilter public abstract ZuulFilter implements IZuulFilter{abstract public String filterType();a ...
- ZuulFilter过滤器
文章目录 1.过滤器 1.1 ZuulFilter 1.2 过滤器执行生命周期 1.3 使用场景 2.自定义过滤器 2.1 定义过滤器类 2.2 测试 Zuul作为网关的其中一个重要功能,就是实现请求 ...
- 自定义ZuulFilter用于验证生成的token
问题背景 微服务体系,一般都是把安全验证做再网关层面的.而一般zuul跟shiro或者spring security的集成会比较好. 但是,有时候公司的业务场景并不复杂,根本无需复杂的架构,那么手写一 ...
- 咖啡汪日志 —— 一文看懂Spring Cloud 网关ZuulFilter的使用和源码(包括FilterFactory 的讲解)
作为乐死不疲的汪界翘楚 本汪每天不是在戏精 就是在戏精的路上了 作为一只纯种哈士奇 玩,就要玩得尽兴而归! 今天与大家一起溜溜,看看 Spring Cloud 网关 ZuulFilter ,从使用到源 ...
- Spring-Cloud 微服务网关Zuul、ZuulFilter过滤器和限流
微服务网关 一. Zuul网关 1. 创建工程 并导入依赖 2. application.yml 配置文件 3. 启动类添加注解 4. 依次启动服务 5. 进入浏览器访问测试 二. ZuulFilte ...
- 网关的其中一个重要功能,就是实现请求的鉴权:zuulFilter
Zuul作为网关的其中一个重要功能,就是实现请求的鉴权.而这个动作我们往往是通过Zuul提供的过滤器来实现的. ZuulFilter ZuulFilter是过滤器的顶级父类.在这里我们看一下其中定义的 ...
- Spring Cloud Zuul之ZuulFilter详解
简介 Spring Cloud Zuul网关在整个微服务体系中肩负对外开放接口.请求拦截.路由转发等作用,其核心处理则是ZuulFilter ZuulFilter部分源码 Zuul Filter全部继 ...
- @Transactional注解最容易忽视的三个失效场景!
@Transactional注解在以下场景中使用,是会失效的,切记! 1.非public方法 spring对注解事务的方法进行校验,修饰符是不是public,不是 public则不会获取@Transa ...
- 2022-2028年中国场景金融行业深度调研及投资前景预测报告
[报告类型]产业研究 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了场景金融行业相关概述.中国场景金融行业运行环境.分析了中国场景金融行 ...
最新文章
- 大数据可视化模板_最佳大数据可视化技术
- html 页面过度效果,HTML页面过渡效果大全
- 关于Delphi中TRttiContext.FindType失效的问题
- 云原生 DevOps,模型化应用交付能力很重要
- Zabbix 钉钉报警
- 随想录(三言两语app)
- Windows多屏开发小记
- 判断DataTable为空,获取值,查询数据,datarow转datatable
- 移动端高保真动态交互元件库+移动端通用元件库+app通用元件库+rpllib元件库+rp源文件+Axure移动端常用组件+数据展示+操作反馈+数据录入+列表页+表单页+通用版布局+业务组件+反馈组件
- 解决手机邮箱登录学生邮箱时服务器无法连接的问题
- java 网页录音并上传_Java+FlashWavRecorder实现网页录音并上传
- 计算机系军训口号四句霸气,军训口号 四句 霸气
- excel更改日期格式无效_Excel日期不会更改格式
- uniapp上传、预览、删除图片
- 抓包那些事——四大抓包神器简介
- android 进度条边框,android用户界面-组件Widget-进度条ProgressBar
- lr_convert_string_encoding: 对中文进行UTF-8转码
- 科学出版社计算机七年级上,科学出版社七年级信息技术下册教案.doc
- Linux C/C++或者嵌入式开发到底有没有35岁危机?
- 在CorelDraw中,VBA宏调用是如何执行的?
热门文章
- 微机原理换行代码_微机原理课程设计——汇编输出杨辉三角
- spss多元非线性曲线拟合_快速掌握SPSS数据分析
- 360手机浏览器_网信办:UC、QQ、360、搜狗等8款手机浏览器被纳入首批整治范围...
- java实现从键盘上输入学生考试的科目和学生的每科分数,输出总分、最高分、最低分、平均分
- 命令行安装Pillow
- Redis Spring集成
- 鼠标悬浮改变背景颜色
- python基础(14)之 类和对象
- oracle11 处理器数,11G AWR中%Total CPU与%Busy CPU指标的疑问
- Python 小白从零开始 PyQt5 项目实战(1)安装与环境配置