最近在后台项目遇到一个跟localStorage的问题,特此记录下采坑的过程。
localStorage失效问题
业务描述:用户登录主账号后,用户的信息会被存在浏览器的localStroage中,这样的好处是即使关闭浏览器,用户下次也不需要主动登录,除非用户主动登出或者localStroage被手动清空。
问题描述: 用户登录主账号后,切换子账号的过程中,此时新开了一个tab页面,localStroage莫名其妙被清空了,由于我司的项目只需考虑现代浏览器即可,按理说使用localStroage完全没问题,但不知为何,它就被莫名清空,运营的小伙伴反馈使用的是360浏览器,现象偶发,没办法,测试了几款浏览器包括360浏览器,未能复现。
我司后台项目使用的是vue框架,结合项目探讨下登录的过程
登录
登录后,登录信息存入localStorage中, 刷新页面过程会再次检查localStorage中是否有用户信息,没有则跳转到登录页面。
1 2 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) } } }
|
路由中限制
切换路由中,校验是否满足路由跳转的条件
1 2 3 4 5 6 7 8 9 10
| export default { ... { path: '/', component: Base, beforeEnter: login, children: children } ... }
|
校验登录的条件, 用户信息不存在的情况下,再次请求用户信息
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
| 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() } }
|