我是这样做的: 用户在登录后把token存在localStorage中,这一切都成功。假如此时用户关闭网页再次打开,从localStorage中读取token,ajax请求服务端验证此token并获得用户信息,保存在vuex store中,但我发现在Router.beforeEach中无法得到ajax请求服务端验证的结果后的vuex store状态,造成打开页面时没有登录,需要再次F5刷新才有。
现在我不知道如何做才能解决。
我是这样做的: 用户在登录后把token存在localStorage中,这一切都成功。假如此时用户关闭网页再次打开,从localStorage中读取token,ajax请求服务端验证此token并获得用户信息,保存在vuex store中,但我发现在Router.beforeEach中无法得到ajax请求服务端验证的结果后的vuex store状态,造成打开页面时没有登录,需要再次F5刷新才有。
现在我不知道如何做才能解决。
登陆/鉴权应该用cookie而不是localStorage吧....后端下发有SET-COOKIE头 前端的请求浏览器也会自动带上cookie... 登陆验证这层理论上不应该和vue有任何关系,前端只应该提供登陆入口,其余时候都是假设已经登陆,发请求,并在后端返回需要登录时提示用户登录。前端保存登陆状态是没有用的。
@fnlctrl 没懂你意思,至于cookie还是localStorage是无所谓的,只是存一个字符串而已。只要支持就够了。你可以能没明白我要问的问题。
@waney 浏览器不会自动把localStorage内容带在HTTP请求头..
但我发现在Router.beforeEach中无法得到ajax请求服务端验证的结果后的vuex store状态,造成打开页面时没有登录
假定你的验证请求是写在vuex的actions里的,那router.beforeEach里肯定也拿不到那个异步action的回调啊..
假设登陆过,有token,那么打开页面的时候vuex的action请求用户信息,并更新数据绑定,结束。没token,那么当后端返回需要登录的时候,调用一下router.redirect。所以这里其实没有beforeEach什么事..
不是issue的问题还是请发到论坛去吧..
我是这么做的,前端不需要使用 cookie, localstorage
import User from 'store/user'
router.map({
'/login': {
component: require('page/user/login'),
name: 'user/login',
layout: 'login'
},
'/order': {
component: require('page/user/order'),
name: 'user/order',
layout: 'order',
auth: 'user'
}
})
router.beforeEach(({to, next}) => {
switch (to.auth) {
case 'user':
User.state.user ||
to.router.go({name: 'user/login'})
break
}
next()
})
router.start({
created () {
User.actions.getUser()
},
name: 'mobile'
}, 'body')
@yozman 你怎么确保用户下一次自动登录
@waney
router.start({
created () {
// 这里从服务器请求当前已登录的用户信息
// 并更新 User store 的 state.user
// 由于写在了根节点刷新之后也会生效的
User.actions.getUser()
},
name: 'mobile'
}, 'body')
@waney 说一下我目前的处理方法: 在根组件的created勾子函数中,调用tokenLogin action (这里面会判断是否已经缓存登录信息,如有就会自动登录。在正常登录的时候,你需要保存登录信息状态等)
你好,issue 是用来报 bug 的,不是用来提问的。报 bug 时,请确保有完整的重现步骤。不符合要求的 issue 会被直接关闭。
no
啊这