添加中间件,处理多个前端来的请求时,如果token需要刷新,先查看缓存,如果没有就在redis中做个标志位进行短期缓存,其他的请求发现缓存中的token,就不再刷新token了。这样就避免了重复刷新token的问题。

中间件代码

   <?phpnamespace App\Http\Middleware;use Closure;use JWTAuth;use Tymon\JWTAuth\Exceptions\JWTException;use Tymon\JWTAuth\Exceptions\TokenExpiredException;use Tymon\JWTAuth\Exceptions\TokenInvalidException;use Illuminate\Support\Facades\Redis;class GetUserFromToken{public function handle($request, Closure $next){$newToken = null;$auth = JWTAuth::parseToken();if (! $token = $auth->setRequest($request)->getToken()) {return response()->json(['code' => '2','msg' => '无参数token','data' => '',]);}try {$user = $auth->authenticate($token);if (! $user) {return response()->json(['code' => '2','msg' => '未查询到该用户信息','data' => '',]);}$request->headers->set('Authorization','Bearer '.$token);} catch (TokenExpiredException $e) {try {sleep(rand(1,5)/100);$newToken = JWTAuth::refresh($token);$request->headers->set('Authorization','Bearer '.$newToken); // 给当前的请求设置性的token,以备在本次请求中需要调用用户信息// 将旧token存储在redis中,30秒内再次请求是有效的Redis::setex('token_blacklist:'.$token,30,$newToken);} catch (JWTException $e) {// 在黑名单的有效期,放行if($newToken = Redis::get('token_blacklist:'.$token)){$request->headers->set('Authorization','Bearer '.$newToken); // 给当前的请求设置性的token,以备在本次请求中需要调用用户信息return $next($request);}// 过期用户return response()->json(['code' => '2','msg' => '账号信息过期了,请重新登录',]);}} catch (JWTException $e) {return response()->json(['code' => '2','msg' => '无效token','data' => '',]);}$response = $next($request);if ($newToken) {$response->headers->set('Authorization', 'Bearer '.$newToken);}return $response;}}

转载于:https://www.cnblogs.com/fenle/p/10666559.html

前端token刷新并发处理相关推荐

  1. Token 刷新并发处理解决方案

    对 Token 进行刷新续期,我们要解决并发请求导致重复刷新 Token 的问题,这也是设计刷新 Token 的难点.这里我会分别介绍前端和后端各自的处理方案. 后端方案:利用 Redis 缓存 当同 ...

  2. 前端token知识梳理:token如何存储?token过期如何处理?如何无感知刷新token?

    在前后端是以token(令牌)的形式交互的,既然是token,是有过期时间的(为了接口数据的安全, 服务器的token不会设置太久,根据需要一般是1-7天),没有一个token是永久的,永久的toke ...

  3. 前端token知识梳理:token如何存储?token过期如何处理?如何无感刷新token?

    在前后端是以token的形式交互,既然是token,那么肯定有它的过期时间(为了接口数据的安全,服务器的token一般不会设置太长,根据需要一般是1-7天的样子),没有一个token是永久的,永久的t ...

  4. vue的token刷新处理

    前言 以token处理登录的web系统,一般会有两个token:access-token和refresh-token. node.js中,一般用jsonwebtoken这个模块. access-tok ...

  5. 前端token知识:token如何存储?token过期如何处理?

    一.前后端交互的过程中token如何存储? 方法1:存在 cookie 中 cookie的大小约4k,兼容性在ie6及以上 都兼容,在浏览器和服务器间来回传递,因此它得在服务器的环境下运行,而且可以设 ...

  6. 基于spring security实现vue2前后端分离的双token刷新机制(完整代码详解,含金量拉满!)

    目录 一.前言: 核心功能概要: 通过加密算法创建一个用户: 二.后端 代码详解: 1.代码整体结构: 2.所需依赖: 3.UserDetailServiceImpl拦截用户登陆: 4.所需工具类 4 ...

  7. Vue中token刷新及token过期的实现

    总:通过axios,vuex,及自定义的方法实现. 以下是思路: 1.做token刷新必不可少的是,token(请求时的token) / refresh_token(刷新token时用的refresh ...

  8. 前端 - token 是什么?为什么每次请求头(HEADS)里要携带它?___请求时,为什么要携带token?

    前端 - token 是什么?为什么每次请求头(HEADS)里要携带它? Token token 是客户端频繁向服务器端请求数据,服务器频繁的去数据库查询用户名和密码进行对比,判断用户名和密码正确与否 ...

  9. html-javascript前端页面刷新重载的方法汇总

    记得我在兴安得力实习要转正的时候,我领导象征性的给我出了一套测试题目,里面就有js闭包和页面刷新等题目.今天把很久之前的测试题目之一,js页面刷新的方法以及页面自动刷新跳转和返回上一页和下一页等方法总 ...

最新文章

  1. 如何找出标有App Store 精华,Essentials的所有软件?
  2. 一个数里有那些约数用c++怎么做_两数的最大公约数你会求吗?(内附完整算法代码)...
  3. supervisor配置环境变量(PATH)
  4. 【渝粤教育】广东开放大学 Python基础与应用 形成性考核 (21)
  5. mysql必知必会_5天学完《MySQL必知必会》学习笔记之第四天
  6. 带权有向无环图的最短路径(使用拓扑排序的方法)
  7. 为什么 Java 不支持类多重继承?
  8. 报错处理——# Creating Server TCP listening socket *:6379: bind: Address already in use
  9. java jpanel 叠加_java之JFrame、JPanel混合布局-Go语言中文社区
  10. IO流的详细描述,字节流的文件操作,以及IO的异常描述处理,字符流的文件操作
  11. 前端进阶之——CSS背景、字体和文本样式
  12. 全体是合同,多学学吧。当前少吃亏。
  13. postgresql开启日志
  14. Java 14中对switch的增强,终于可以不写break了
  15. 已通过认证的微信公众号名字可以改吗?
  16. 分享 10 个高星的创意项目!
  17. this指向,并改变this指向
  18. 将文件从 Linux 传输到 Windows
  19. 布谷鸟哈希函数的参数_Cuckoo Hash 布谷鸟哈希
  20. python的scapy_scapy-python

热门文章

  1. WPF-002 下拉列表的简单实现
  2. 方案里最常用的集群拓扑图(包含:多机集群、负载均衡、双机)
  3. 2021年中国工业互联网安全大赛核能行业赛道writeup之鱿鱼游戏
  4. android逆向分析概述_Android存储概述
  5. javascript编写_如何通过编写自己的Web开发框架来提高JavaScript技能
  6. Spring Boot与ActiveMQ的集成
  7. 基于matlab的硅晶体模型,基于Matlab的图像处理技术识别硅太阳电池的缺陷
  8. 因果图方法中的基本符号
  9. ELMo:最好用的词向量(Deep contextualized word representations)论文 pdf
  10. Python 安装selenium