当前位置:首页 > 探索 > js获取token

js获取token

2026-10-17 05:46:59 [热点] 来源:力不从心网

登录接口返回的token,通常就藏在响应头的Authorization字段里,或者藏在响应体的data.token中。但真正让你头疼的,往往是那个“取出来之后怎么存”的问题。

我见过太多前端同事,一上来就localStorage.setItem('token', res.data.token),干净利落。但没过多久,用户反馈说“我明明登录了,刷新一下就退出登录了”。排查半天,发现是后端把token的有效期设成了30分钟,而localStorage里的token过期后,前端根本不知道——它只会傻傻地带着这个失效的token去请求接口,然后收到401。

所以,取token的第一步,不是“取”,而是先搞清楚后端给的是什么类型的token。JWT(JSON Web Token)和Opaque Token(不透明字符串)的处理方式完全不同。JWT的payload里带着过期时间,前端可以自己解析出来做提前判断;而Opaque Token就是个随机字符串,你只能靠后端返回的expires_in字段来倒计时。

说个具体场景。我去年做一个后台管理系统,后端小哥给的是JWT,放在响应体里:{ "code": 0, "data": { "access_token": "eyJhbGciOi...", "expires_in": 7200 } }。我当时的做法是:

const {  access_token, expires_in } = res.data.data; // 存内存,不存localStorage store.token = access_token; store.tokenExpiry = Date.now() + expires_in * 1000; 

为什么存内存而不是localStorage?因为那个系统是内部工具,用户关掉浏览器再打开,重新登录一次成本很低。但如果是面向C端的应用,用户关掉浏览器第二天再打开,你让他重新登录,他大概率会骂人。这时候就得用localStorage,但必须配合“记住我”选项——勾选了才存,没勾选就只存sessionStorage。

取token时还有个坑,就是请求拦截器里怎么拿。axios拦截器是这么写的:

axios.interceptors.request.use(config => {  const token = store.token || localStorage.getItem('token'); if (token) {  config.headers.Authorization = `Bearer ${ token}`; } return config; }); 

这段代码看起来没问题,但实际运行中你会遇到一个诡异的现象:用户登录成功后,第一次发请求居然没带token。原因在于——登录接口的响应还没回来,你就把token存进store了,但此时如果另一个请求恰好也在路上,拦截器执行时store.token还是空的。这种竞态条件,用Promise.all或者队列能解决,但最粗暴的办法是登录成功后延迟100毫秒再发其他请求。

更实用的做法是,把token的获取封装成一个函数,而不是直接读变量。比如:

function getToken() {  return store.token || localStorage.getItem('token') || sessionStorage.getItem('token'); } 

然后在拦截器里调用getToken()。这样即使store还没更新,也能从storage里兜底拿到。但注意,storage的读取是同步的,频繁读取会影响性能——不过token读取不像图片加载那么频繁,实际影响可以忽略。

还有一个细节容易被忽略:token里可能带着特殊字符,比如JWT的签名部分有.和-,如果你把token拼在URL里(比如用GET请求传token),必须用encodeURIComponent包一层。别笑,我真见过有人直接把token拼在query上,结果后端解析出来少了一截,排查了半天发现是token里的+号被浏览器当成空格了。

最后说个反直觉的事。有时候你费尽心思把token取出来了,发现后端压根不认。原因是后端要求的是“双token机制”——access_token和refresh_token。access_token短命(15分钟),refresh_token长命(7天)。前端在access_token过期时,不能傻傻地跳登录页,得用refresh_token去换新的access_token。这时候取token的逻辑就变成了:先检查本地有没有refresh_token,有就静默刷新,没有才让用户重新登录。

所以你看,取token这件事,表面上是“从响应里拿字符串”,实际牵扯到存储策略、过期处理、竞态条件、编码格式。写代码前先问自己三个问题:这个token会活多久?用户关掉浏览器后还在不在?后端希望我用什么方式带回去?想清楚了,再动手写那行赋值语句也不迟。

(责任编辑:探索)

推荐文章
  • 支付宝跑分平台代理

    支付宝跑分平台代理 跑分平台代理这活儿,听起来像是个正经金融项目,实际上就是给黑产洗钱当中间商。我见过一个代理,叫阿凯,95后,朋友圈天天晒转账截图,说日入三千不是梦。他拉人头的方式很直接——在兼职群里发“急招代收款,日 ...[详细]
  • 攻防陈小兵

    攻防陈小兵 陈小兵蹲在机房里,手指在键盘上敲得飞快。屏幕上滚动着一串串十六进制字符,像某种神秘的水文。他身后站着三个实习生,大气都不敢出。忽然他停下来,指着屏幕某处:“看,这里有个溢出点。” 那是去年秋天的事了。 ...[详细]
  • 工程师自我介绍

    工程师自我介绍 我的工位抽屉里永远放着三样东西:一把剥线钳、一块树莓派、还有一张写满密码的便签纸。这大概就是我的全部身份了——一个在二进制世界里游泳,又不得不每天和现实世界讨价还价的工程师。 入行十年,我干过最得意的 ...[详细]
  • 站长工具精品视频日本

    站长工具精品视频日本 打开《站长工具精品视频日本》这个页面时,我第一反应是"这名字起得真够直白的"。精品视频四个字放在站长工具后面,像把寿司摆在键盘旁边,违和感拉满。可点进去才发现,这网站压根不是什么正经工具站——它是个索 ...[详细]
  • 群晖 mediawiki 套件

    群晖 mediawiki 套件 群晖 mediawiki 套件:自建知识库的甜与痛 我把群晖DS920+买回家的第三天,就装了MediaWiki套件。原因很简单——Notion太贵,Confluence太笨重,而我的技术笔记散落在 ...[详细]
  • 红帽认证工程师

    红帽认证工程师 红帽认证工程师RHCE)这张证书,在Linux圈子里争议不小。有人把它捧成求职敲门砖,有人觉得它不过是纸面功夫。我见过拿着RHCE却连NFS挂载都搞不定的,也见过没证书但能把内核参数调得飞起的。但抛开 ...[详细]
  • 黑客装逼软件电脑版

    黑客装逼软件电脑版 打开某宝搜“黑客软件”,月销过万的那几家,你点进去看详情页,清一色是深蓝底、绿色代码雨、红色警告框。评论区里全是“懂的都懂”“亲测有效”的暗语。但你真花199块买回来,解压出来是个几百兆的exe,双击 ...[详细]
  • burpsuite最新版本

    burpsuite最新版本 Burpsuite Professional 2024.6 在六月底悄然上线。我没看到官方大张旗鼓的宣传,但这版更新里藏着一个真正值得动手试试的东西——新的基于DOM的扫描引擎。它不再只盯着URL和参 ...[详细]
  • 黑洞频率在线观看完整版免费原声

    黑洞频率在线观看完整版免费原声 《黑洞频率》这片子,我昨晚又刷了一遍。不是影院,不是流媒体正版页面,是某个小网站弹窗里跳出来的“原声完整版”。画质糊得像蒙了层纱,但音轨倒是干净,约翰·库萨克的声音穿过二十年时光,依然带着那种困惑又执 ...[详细]
  • 2022河南专技在线挂机

    2022河南专技在线挂机 2022年河南专技在线挂机,说白了就是一场和服务器比耐心的游戏。那会儿我在郑州,电脑开着,浏览器挂着,人躺在沙发上刷手机,眼睛却得时不时瞟一眼屏幕角落那个转圈的小图标——它一转,我的心就跟着悬起来。 ...[详细]
热点阅读