一. Token 使用流程以及如何保存在vuex里面

1. 说明: 并不是所有的接口,都可以无限制请求的,在有些请求里面,需要权限的,

需要带上凭证

这里的token就相当于一把钥匙,我在发送请求的时候只要带上这把钥匙

它是后端接口提供的,一般用户登录成功,后端就会返回一个token给我们

  1. **注意: 不带token的访问就会导致401的错误**<br />** **![image.png](https://cdn.nlark.com/yuque/0/2021/png/21762447/1622984300110-b22ff4fc-8bb6-422a-8b2d-52a989d0f203.png#clientId=u42ca6171-01a5-4&from=paste&height=59&id=udbffd22a&margin=%5Bobject%20Object%5D&name=image.png&originHeight=59&originWidth=706&originalType=binary&ratio=1&size=17968&status=done&style=none&taskId=u14b5d9e5-e522-459d-b5b6-ec6a5eb9a5a&width=706)

2. Token的基本使用流程

用户登录,获取token;

保存token到本地;

发起其它请求,携带token (这一部分在axios请求拦截器中)


3. 如何将token保存到vuex里面 ? *

分析:image.png

步骤1: 设置vuex(定义state,mutations,actions)

  1. import {api里面定义的请求函数名} from '@/api/uer.js'
  2. // 公共数据
  3. state:{
  4. AAA:
  5. },
  6. // 定义mutations来修改数据
  7. mutations:{
  8. mSetTokenInfo(state,newInfo) {
  9. state.AAA = newInfo
  10. }
  11. },
  12. actions:{
  13. async BBB (context,参数) {
  14. try{
  15. // 获取信息
  16. const res = await api里面定义的请求函数名() {
  17. // 调用mutations 保存修改的数据
  18. context.commit('mutations模块名', 获取到的token) ***
  19. }
  20. } catch (err) {
  21. console.log(err)
  22. throw new Error(err)
  23. }
  24. }
  25. }


步骤2: 调用actions 保存token值

  1. 省略其他....
  2. await this.$store.dispatch('actions的名字BBB', 参数)

验证 : 在vue里面的vuex看看token值有没有保存进去

图示说明: image.png


二:Token持久化

解释: 因为token在刷新页面的时候就消失了,在程序重新运行时,值才会恢复.

比如:在做登录功能 需要有token用户才能操作一些事情,但是每次一刷新页面,token值就没

了,一些功能也没了,又需要重新登录才能做下面的功能,就非常麻烦

持久化: 让页面刷新时,数据还在

解决思路:

1. 用户登录成功以后,保存token到vuex,同时也存一份到本地存储localstorage

2. 在vuex容器初始化时(页面刷新时),使用本地存储的值

图示说明:

image.png

步骤:

1. 封装localstorage存储模块 在src/utils/storage.js

  1. // 封装localstorage对token(对象)的三个操作
  2. const TOKEN-NAME = 'my-token'
  3. // 1.保存
  4. export const saveToken = (tokenObj) => {
  5. localStorage.setItem(TOKEN_NAME, JSON.stringify(tokenObj))
  6. }
  7. // 2. 获取
  8. export const getToken = () => {
  9. return JSON.parse(localStorage.getItem(TOKEN_NAME))
  10. }
  11. // 3. 删除
  12. export const delToken = () => {
  13. localStorage.removeItem(TOKEN_NAME)
  14. }

2. token持久化 - 保存token

在调用登录接口,登录成功以后,服务器会返回token信息给我们

上面将token保存到了vuex里面,现在要做的事情就是把token持久到本地

代码:

  1. 省略其他...
  2. + import { setToken } from '../utils/storage.js'
  3. export default new Vuex.Store({
  4. // 保存公共数据
  5. state: {
  6. tokenInfo: {}
  7. },
  8. // state中的数据要通过mutations才能修改
  9. mutations: {
  10. // mutation就是一个一个的函数, 第一个参数是当前的state, 第二个是载荷:要传入的数据
  11. mSetTokenInfo (state, newTokenInfo) {
  12. // 将token保存在了vuex中
  13. state.tokenInfo = newTokenInfo
  14. // 将token保存到本地localstorage ***********
  15. setTokenObj(newTokenInfo)
  16. }
  17. },

3. token持久化 - 获取token

页面刷新,从localstorage中获取token

代码:

  1. 省略其他...
  2. import { setTokengetToken } from '../utils/storage.js'
  3. export default new Vuex.Store({
  4. // 保存公共数据
  5. state: {
  6. tokenInfo: getToken() || {} // 获取token ****
  7. },
  8. mutations: {
  9. mSetTokenInfo (state, newTokenInfo) {
  10. state.tokenInfo = newTokenInfo
  11. // 保存到本地localstorage **********
  12. setTokenObj(newTokenInfo)
  13. }
  14. },

这个时候刷新页面,vuex中还有值就表示成功了


二. 登录-发送ajax请求做登录

预检请求:

image.png

注意: 在这里会有两次请求,有一个0KB的是预检请求(有点类似于一个跑腿的,帮你看看请求成功了没)