token系统讲解及过期处理

article/2025/7/21 13:20:32

token系统讲解及过期处理

    • 1. token是什么?用来做什么
    • 2. token存储在哪?过期了怎么办?
    • 3. 请求拦截与响应拦截执行时机(面试重点)
    • 4. 解决token过期方案一: `重新登录`
    • 5. 方案二:使用 `refresh_token` 方案

在这里插入图片描述

  • 这玩意很简单,记录一下吧,给入门的小白用下

1. token是什么?用来做什么

  • token通常译为令牌,暗号。举个例子:我是古时候皇城中大内的高手(看门的大爷),进皇宫需要皇帝发的特制令牌,没有指定的令牌是不能进的,我会把你拦住,说不定还会把你胖揍一顿。皇宫在这里就相当于我们项目,为了项目的安全性,设置了这个token,进项目的人都需要有这个玩意,证明你有这个权限。
  • token是怎么生成的? 通过哈希算法(不常用)、uuid(雪花算法,可保持全球唯一性),jwt工具等生成随机字符串(也可能会拼接上用户的一些信息)
  • 为什么token要有有效期?而且设置得这么短? 为了提高token的安全性,不能永久有效,降低被别人劫持的风险
  • 有时候登录的时候为什么会有多个token?
    1. 常规 token:使用频繁,有效期比较短
    2. refresh_token:当token过期的时候,用来得到新的token的,使用不频繁,有效期比较长(一般为一个月)
  • 我们怎么知道token过期了? 通过调接口时返回的状态码,如果状态码是401(一般情况下),就说明没有携带token,或者token过期了
    在这里插入图片描述

2. token存储在哪?过期了怎么办?

  • token由服务端生成,通过接口传给前端。
  • 一般在登录接口会给token值
  • 存储看具体的项目场景,一般存储在本地缓存里,有两种方案供君选择:
    1. sessionStorage(会话级别,网页一关就歇逼了)
    2. localStorage(永久的,需要手动去清除)
  • token过期处理
    1. 重新登录 => 清空token,跳转登录页
    2. refresh_token => 得到一个全新的token

3. 请求拦截与响应拦截执行时机(面试重点)

  • 这玩意面试问的多,看图很清晰:
    在这里插入图片描述
  • 请求拦截器执行时机:axios调用之后,浏览器真正发起请求之前
  • 响应拦截器执行时机:浏览器接受到响应数据之后,axios拿到数据之前

4. 解决token过期方案一: 重新登录

  • 知道出现了401的错误: 使用响应拦截器
  • 进行页面的跳转
  • 此种方案用户体验不是很好(目前大部分企业及项目都这么干)
import store from '@/store'// 响应拦截器
request.interceptors.response.use(function (response) {// 响应成功(响应状态码是 2xx)时执行第一个回调函数console.log('响应成功....')return response}, function (error) {// 网络异常或响应失败(响应状态码是非2开头)时执行第二个回调函数console.log('响应失败....')// 1. 判断响应的状态码是不是401,如果不是401就不用做任何处理if (error.response && error.response.status === 401) {// 2. 如果是401,就先清空token, 并跳转到登录页store.commit('setUser', null)router.push('/login')}return Promise.reject(error)}
)

5. 方案二:使用 refresh_token 方案

  • 判断有没有refresh_token,如果没有跳转登录页
  • 如果有refresh_token,调用刷新token的接口,拿到新的token
    1. 更新vuex和loaclStoreage存储的token
    2. 为原来调用接口方,重新去调用接口
  • 如果利用refresh_token,刷新token的接口失败,则还是跳转到登录页
  • 附上了详细的注释,讲道理大佬们应该看得懂
import axios from 'axios'
import store from '@/store'
import router from '@/router'const baseURL = 'http://xxx.xxx.net/'const request = axios.create({baseURL // 接口的基准路径
})// 请求拦截器
// Add a request interceptor
request.interceptors.request.use(function (config) {// 请求发起会经过这里// config:本次请求的请求配置对象const { user } = store.stateif (user && user.token) {config.headers.Authorization = `Bearer ${user.token}`}	// 注意:这里务必要返回 config 配置对象,否则请求就停在这里出不去了return config
}, function (error) {// 如果请求出错了(还没有发出去)会进入这里return Promise.reject(error)
})request.interceptors.response.use(function (response) {// 响应成功(响应状态码是 2xx)时执行第一个回调函数return response}, async function (error) {// 网络异常或响应失败(响应状态码是非2开头)时执行第二个回调函数console.log('响应失败时执行的代码....')if (error.response && error.response.status === 401) {const user = store.state.userif (user && user.refresh_token) {// 1. 判断有没有refresh_token,如果没有跳转登录页// 2. 如果有refresh_token,调用刷新token的接口,拿到新的tokentry {var res = await axios({baseURL: baseURL,method: 'PUT',url: '/xxx/xxx',headers: {Authorization: `Bearer ${user.refresh_token}`}})} catch {// 5. 如果refresh_token过期,进行清空token并跳转到登录页的处理store.commit('setUser', null)router.push('/login')}//  3. 更新vuex和loaclStoreage存储的tokenstore.commit('setUser', {refresh_token: user.refresh_token,token: res.data.data.token})//    4. 为原来调用接口方,重新去调用接口console.log(error.config)return request(error.config)} else {// 1. 判断有没有refresh_token,如果没有跳转登录页store.commit('setUser', null)router.push('/login')}}// 3. 如果利用refresh_token,刷新token的接口失败,则还是跳转到登录页// eslint-disable-next-line prefer-promise-reject-errorsreturn Promise.reject(error)}
)export default request

1. 希望本文能对大家有所帮助,如有错误,敬请指出

2. 原创不易,还请各位客官动动发财的小手支持一波(关注、评论、点赞、收藏)
3. 拜谢各位!后续将继续奉献优质好文
4. 如果存在疑问,可以私信我(主页有Q)

在这里插入图片描述


http://chatgpt.dhexx.cn/article/DO66qOrf.shtml

相关文章

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

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

处理token过期的问题,无感知刷新token

401错误的场景 有如下两种情况会出现401错误: 未登陆用户做一些需要权限才能做的操作,代码会报出401错误。这种情况下,应该让用户回到登陆页。登录用户的token过期了 整体目标是:通过axios响应拦截器来处理401问题。 理解toke…

前端怎么判断token过期或无token问题

有如下两种情况会出现401错误: 未登陆用户做一些需要权限才能做的操作(例如:关注作者),代码会报出401错误。这种情况下,应该让用户回到登陆页。登录用户的token过期了 ( token会有有效期(具体是…

react中 token过期,如何处理?

思路:首先在request.js中的响应拦截器这块写token失效的提示,然后再让它进行清空token和路由跳转 第一步:在request.js文件中 导入 import store from /store import { logout } from /store/actions/login 第二步:在响应拦截器…

token 过期解决

vue如何在token过期之后跳转到登录页面,且不影响其他无需携带token的接口数据访问 事情是这样的,最近做了一个类似于商城的项目。本来测试是没有问题的,后来过了大概三四天的时间没有在浏览器中打开过,再打开以后,在未…

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

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

token过期怎么办 无感刷新token

(1)可以通过响应拦截器或者全局前置守卫强制跳转登录页 // 全局前置守卫 router.beforeEach((to, from) > {let token sessionStorage.token;if (token) {return true} else {return { name: Login, query: { redirect: to.fullPath } };} }) // 添…

关于 Token 过期问题的两种解决方案

对于token过期,我们有两种方案: 方案一:当我们操作某个需要token作为请求头的接口时,返回的数据错误error.response.status 401,说明我们的token已经过期了。 我们希望当响应返回的数据是401身份过期时,让…

Latex 符号(Symbols)

Latex符号广泛用于数百个类别的不同主题中。对于数学或其他学科中使用的每个符号,将使用相应的命令。本主题将为您提供有关符号的详细概念和说明,以及以哪种方式可以使用所有符号。 使用标准文本,您可以使用任何符号。这种方法不仅节省了精力…

Latex特殊符号汇集

原文链接:https://blog.csdn.net/ying_xu/article/details/51240291 这段时间用Latex很多,常常需要查阅相关特殊的符号,这里做一个整理,也方便大家查阅。 摘自:《一份不太简短的LATEX2介绍》或112分钟学会LATEX2 原…

(13.1)Latex符号、公式及伪代码

文章目录 一、符号大全和小工具1、符号大全2、小工具(1)图片转Latex(2)在线Latex公式编辑 二、公式格式三、伪代码四、注意事项1、符号宏包2、颜色宏包3、换段未缩进4、单引号和双引号 一、符号大全和小工具 1、符号大全 Latex …

LaTex常见数学符号与示例

在写文档或者博客过程中,数学公式是最难表示的,比如根号,下标号,分号,还有绝对值的表示,复杂一些的比如矩阵的表示,积分的表示,求和公式。 LaTex提供了丰富的表示方法,用…

Latex数学符号对应表

Latex数学符号对应表 - 叮叮当当sunny - 博客园 目录 1. 希腊字母2. 运算符符号3. 关系符号4. 箭头符号5. 括号符号6. 其他符号7. MATLAB 回到顶部 1. 希腊字母 字母实现字母实现αα\alphaAA\Alphaββ\betaBB\Betaγγ\gammaΓΓ\Gammaδδ\deltaΔΔ\Deltaϵϵ\epsilon…

LateX各种命令符号

函数、符号及特殊字符 声调 语法效果语法效果语法效果\bar{x}\acute{\eta}\check{\alpha}\grave{\eta}\breve{a}\ddot{y}\dot{x}\hat{\alpha}\tilde{\iota} 函数 语法效果语法效果语法效果\sin\theta\cos\theta\tan\theta\arcsin\frac{L}{r}\arccos\frac{T}{r}\arctan\frac{L}{…

Latex特殊符号大全(高清)

Latex符号大全 转载内容供自己阅读 原文:Latex特殊符号大全(高清)

Latex常见符号对照表

摘要: Latex可以很方便的利用命令来生成各式各样的特殊符号. 这里根据官方的文档将这些常见符号列出, 以备查用. B.1 希伯来和希腊字母(Hebrew and Greek letters) 希伯来语: 希腊语: 数学表达式中常常用下面的这些符号, 分小写/大写 B.2 二元关系符(Binary relations) …

LaTeX最全的数学符号大全(更新中…… )

文章目录 1 基本字符常用数集字母字母加标表示希腊字母 2 四则运算运算符号等号比较范围 3 常用函数4 离散数学运算符5 集合集合表示集合操作集合关系 最后更新于2020/12/02 1 基本字符 常用数集字母 符号 LaTeX \LaTeX LATE​X符号说明示例 N \mathbb{N} N\mathbb{N}自然数集…

Latex所有常用数学符号吐血整理(包含大括号、等式对齐、矩阵)

果然是自己搞一个查起来会方便一些,最近天天写数学题解,全是公式 ~ 希腊字母: 字母名称国际音标大写字母小写字母字母名称国际音标大写字母小写字母alpha/lfə/Ααnu/nju:/Ννbeta/bi:tə/或 /beɪtə/Ββxi希腊 /ksi/;英美 …

LaTeX 符号命令大全

函数、符号及特殊字符 声调 语法效果语法效果语法效果\bar{x} \acute{\eta} \check{\alpha} \grave{\eta} \breve{a} \ddot{y} \dot{x} \hat{\alpha} \tilde{\iota} 函数 语法效果语法效果语法效果\sin\theta \cos\theta \tan\theta \arcsin\frac{L}{r} \arc…