最近在后台项目遇到一个跟localStorage的问题,特此记录下采坑的过程。
localStorage失效问题
业务描述:用户登录主账号后,用户的信息会被存在浏览器的localStroage中,这样的好处是即使关闭浏览器,用户下次也不需要主动登录,除非用户主动登出或者localStroage被手动清空。
问题描述: 用户登录主账号后,切换子账号的过程中,此时新开了一个tab页面,localStroage莫名其妙被清空了,由于我司的项目只需考虑现代浏览器即可,按理说使用localStroage完全没问题,但不知为何,它就被莫名清空,运营的小伙伴反馈使用的是360浏览器,现象偶发,没办法,测试了几款浏览器包括360浏览器,未能复现。
我司后台项目使用的是vue框架,结合项目探讨下登录的过程
登录
登录后,登录信息存入localStorage中, 刷新页面过程会再次检查localStorage中是否有用户信息,没有则跳转到登录页面。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 
 | export default {state: {
 
 user: storage.get(USER)
 },
 mutations: {
 [SET_USER] (state, data) {
 state.user = data
 }
 },
 ...
 actions: {
 login ({commit}, data) {
 storage.set(USER, data)
 commit(SET_USER, data)
 }
 }
 }
 
 | 
路由中限制
切换路由中,校验是否满足路由跳转的条件
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 
 | export default {...
 {
 path: '/',
 component: Base,
 beforeEnter: login,
 children: children
 }
 ...
 }
 
 | 
校验登录的条件, 用户信息不存在的情况下,再次请求用户信息
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 
 | export function login(to, from, next) {if (!store.getters.user) {
 let nextParams = {path: '/login'}
 let redirect = to.fullPath
 if (redirect !== '/') {
 nextParams.query = {redirect: to.fullPath}
 }
 
 var url = ''
 Vue.http.get(url).then(res => {
 res = res.body
 if (res.error === 0 && res.data) {
 
 store.dispatch('login', res.data)
 next()
 } else {
 next(nextParams)
 }
 }, () => {
 next(nextParams)
 })
 } else {
 next()
 }
 }
 
 |