双token无感刷新结合redis的流程是怎么样的

#jwt##java#首先双token是什么,就是当你点击登录的时候会生成两个token,
第一个叫AccessToken,第二个叫RefreshToken
第一个主要作用就是每次在业务请求是会携带这个token,会设置较短的过期时间,这个token一般储存在浏览器的localStorage属于本地储存,后续由js代码读写
第二个就是RefreshToken一般储存在前端cookie中有httpOnly属性代表它只能通过http协议进行,这个非常的安全,前端是拿不到这个数据的,同时也会在redis中存储这个RefreshToken,AccessToken过期时候通因为只有在协议里可以携带refreshtoken,所以会调用业务接口发送请求,请求里携带了这个RefreahToken,后端生成新的AccessToken返回给前端再进行业务访问,
无感刷新实现的核心操作就是前端js监听到AccessToken过期或者状态码401,立马就向着后端去发送这个refreshToken,
这个时候先在redis中进行验证,假如有这个token然后放行,后端再生成新的AccessToken返回给前端,假如没有这个token比如过期或者黑名单,就返回到登录界面重新进行登录。redis的作用就是验证ReFreshToken是否过期为ReFreshToken设置过期时间或者为ReFreshToken延长过期时间
这是目前学习到的个人看法如果有问题请帮忙指正谢谢
这是个单点登录,用户每次业务访问都要看accessKey是否有效,是否在黑名单中
全部评论

相关推荐

头像 会员标识
昨天 18:24
门头沟学院 Java
可运行版本 import java.util.HashMap;import java.util.Map;class LRUCache {class DLinkedList{int key;int val;DLinkedList next;DLinkedList prev;long timeStamp;public DLinkedList(){this.timeStamp = System.currentTimeMillis();}public DLinkedList(int key,int val){this.key = key;this.val = val;this.timeStamp = System.currentTimeMillis();}}int capacity;int size;DLinkedList head;DLinkedList tail;Map<Integer,DLinkedList> map;long ttl;public LRUCache(int capacity,long ttl){this.capacity = capacity;size = 0;head = new DLinkedList();tail = new DLinkedList();head.next=tail;tail.prev = head;map = new HashMap<>();this.ttl = ttl;}public void addToHead(DLinkedList node){node.next = head.next;head.next.prev = node;node.prev = head;head.next = node;}public void removeOne(DLinkedList node){node.next.prev = node.prev;node.prev.next = node.next;}public boolean isExpired(DLinkedList node){long now = System.currentTimeMillis();long diff = now-node.timeStamp;if(diff>ttl){return true;//true是过期了的意思 false才是没过期!!!}return false;}public int get(int key){if(!map.containsKey(key)){return -1;}else{DLinkedList node = map.get(key);if(isExpired(node)){removeOne(node);map.remove(key);size--;return -1;}node.timeStamp = System.currentTimeMillis();removeOne(node);addToHead(node);return node.val;}}public void put(int key,int val){if(!map.containsKey(key)){DLinkedList newNode = new DLinkedList(key,val);addToHead(newNode);map.put(key,newNode);size++;if(size>capacity){DLinkedList oldNode = tail.prev;removeOne(oldNode);map.remove(oldNode.key);size--;}}else {DLinkedList newNode = new DLinkedList(key,val);DLinkedList oldNode = map.get(key);removeOne(oldNode);addToHead(newNode);map.put(key,newNode);}}}class Main{public static void main(String[] args) {LRUCache cache = new LRUCache(2, 1000); // 1秒TTLcache.put(1, 1);cache.put(2, 2);System.out.println(cache.get(1)); // 返回 1try {Thread.sleep(1500); // 等待1.5秒让数据过期} catch (InterruptedException e) {e.printStackTrace();}System.out.println(cache.get(1)); // 返回 -1(已过期)System.out.println(cache.get(2)); // 返回 -1(已过期)}}
点赞 评论 收藏
分享
评论
2
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务