本地缓存处理方案
# 处理方案
在获取到 token
之后,我们会把 token
进行缓存,而缓存的方式将会分为两种:
- 本地缓存:
LocalStorage
- 全局状态管理:
Vuex
保存在 LocalStorage
是为了方便实现 自动登录功能(token没过期的情况下)
保存在 vuex
中是为了后面在其他位置进行使用
# LocalStorage
创建 utils/storage.js
文件,封装三个对应方法:
/*
* 存储数据
* */
export const setItem = (key, value) => {
// value分两种情况:
// 1.基本数据类型
// 2.复杂数据类型
// 将数组、对象类型的数据转化为 JSON 字符串进行存储
if (typeof value === 'object') {
// 转成 JSON 格式
value = JSON.stringify(value)
}
window.localStorage.setItem(key, value)
}
/*
* 获取数据
* */
export const getItem = key => {
const data = window.localStorage.getItem(key)
// 无论 data 是什么格式直接解析
try {
return JSON.parse(data)
} catch (err) {
return data
}
}
/*
* 删除指定数据
* */
export const removeItem = key => {
window.localStorage.removeItem(key)
}
/*
* 删除所有数据
* */
export const removeAllItem = () => {
window.localStorage.clear()
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# Vuex
将
token
保存起来,不希望直接在actions
保存,还需在Vuex
存一份,因此在对应的mutations
里进行保存。
# 执行前提
首先创建好state
中指定初始值token
、mutations
中指定方法setToken
。
当mutations
触发的时候,将state
中的token
转成我们的token
,同时调用setItem
将token
保存在localStorage
。
# 执行步骤
登录成功时login
方法,触发对应的mutations
,通过this.commit('user/setToken',data.data.data.token)
方法,将token
保存在mutations
中。
在mutations
里面的setToken
方法,将token
放在state
同时也放在localStorage
。
往后创建页面或者浏览器重新进入时,token
就会在localStorage
中获取,否则就是空字符串。
# 代码实现
在 vuex
的 user
模块下,处理 token
的保存(所有和用户相关的数据都放在这个文件下,因此保存操作要在这里完成)
// 接口方法
import { login } from '@/api/sys'
// 密码加密
import md5 from 'md5'
// 登录成功后,调用该方法将token保存在本地缓存中
import { setItem, getItem } from '@/utils/storage'
// TOKEN常量
import { TOKEN } from '@/constant'
export default {
namespaced: true,
state: () => ({
// 用户登录成功后,要实现自动登录效果
// 初始化时,先获取,获取不到token就指定空字符串
token: getItem(TOKEN) || ''
}),
mutations: {
// 当mutations触发的时候
setToken (state, token) {
// 保存在Vuex
state.token = token
// 保存在本地缓存(用常量进行保存,通过常量每次去存取删对应的操作时,都使用常量)
setItem(TOKEN, token)
}
},
actions: {
/*
* 登录请求动作
* */
login (context, userInfo) {
const {
username,
password
} = userInfo
return new Promise((resolve, reject) => {
login({
username,
password: md5(password)
}).then(data => {
// 成功时触发setToken方法
// token值保存在data中
this.commit('user/setToken', data.token)
resolve()
}).catch(err => {
reject(err)
})
})
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
上次更新: 2024/08/14, 04:14:33