关于token的一点小小的思考

来源:8-4 登录第三部分 持久化登录状态

慕莱坞0998854

2020-11-09

这一节课,我们通过把loken存放在localStorage来实现持久化的存储,这里面有一个场景,用户在登录之后,如果刷新了页面,这时token还存在localStorage,可是用户的基本信息(如用户名)却丢失了,所以我们在App.vue里获取用户信息。此时会进行一次axios的header的设置的操作
代码如下图(App.vue)
图片描述
而我们在login的时候,在store.ts里面同样对axios的header进行了设置
代码如下(store.ts)
图片描述

这样有个问题,就是我们在不同的地方设置axios的header,过一段时间之后我们可能会疑惑,我为什么要在这个地方设置header啊?又得重新捋一遍逻辑。
所以,我想的时能不能把设置header的这段逻辑统一写在axios的配置部分,和defaultURL以及interceptor一样,其他地方就不用管header的事啦
代码如下
图片描述

这样又带来了新的问题,
登录之后(并没有刷新页面,直接跳到主页),上面的代码不会再运行,此时不会设置header
只要不刷新页面,这个axios文件就不会重新加载,这个header就不会更新

那么,我的问题是,这vue3不是有ref和reactive嘛,我们能不能检测到token的改变,自动去设置新的header呢?
伪代码:

	const token = ref(localStorage.getItem("token"))
	watchEffect(token,(newVal)=>{
		axios.defaults.headers.common["Authorization"] = `Bearer ${token}`;
	})

这当然只是伪代码( 我们每次都是直接localStorage.setItem( “token”, newVal ), 上面的代码应该无法检测到token的改变 ),想问下应该正确实现token改变,自动更新header的需求呢?

写回答

1回答

张轩

2020-11-10

同学你好欧 感谢你的认真思考 非常详细的过程 给你点赞 最后你提出来自己的解决方法,但是注意getItem 这个值是直接拿出来的,这是一个取值的过程(并没有改变),并不能监控它的变化,所以我觉得这种方法可行性是存疑的。后面的课中我会把检查放到 router 当中去,但是 login 操作后赋值还是需要写的。如果你避免代码重复,可以把它抽象成一个单独的函数,但是实际上还是要写多次,我认为这里的逻辑很直观的就是这样。没必要为了极致而把简单的思维模式打破。

0
1
慕莱坞0998854
谢谢老师耐心的回答!
2020-11-10
共1条回复

Vue3 + TS 仿知乎专栏企业级项目

带你完成前后端分离复杂项目,率先掌握 vue3 造轮子技能

3074 学习 · 2253 问题

查看课程