在 Vue/Vue Router 应用中如何优雅地检测用户登录状态?

2018-12-21 16:28:13 +08:00
 fourstring

我现在采用的方案是为需要登录后才能访问的路由添加一个 meta.requireLogin 元信息,然后使用 beforeEach 全局导航守卫,且在后端开放一个只返回用户是否登录的 API (检测 session 中的信息),并在 beforeEach 全局导航守卫中请求该 API 之后检测返回结果。(不依靠这种机制来阻止未登录用户访问,后端 API 逻辑有检测用户权限,只是为了当未登录用户访问需要登录路由时自动重定向到登录页面)

我觉得这种方法的主要问题是会重复请求一个后端 API,造成不必要的网络请求浪费,请问是否有可以避免这么多次重复请求的方案呢?谢谢!

3530 次点击
所在节点    Vue.js
8 条回复
zjwshisb
2018-12-21 16:32:20 +08:00
在 axios 的拦截器处理就行了,未登录访问需要登录的页面时 api 接口返回 403, axios response 对 403 统一处理
fourstring
2018-12-21 16:37:26 +08:00
@zjwshisb #1 那这样实现的话是不是只能用 History API 来重定向了?还能用 Vue Router 吗?
ochatokori
2018-12-21 16:41:53 +08:00
@fourstring 我是在 axios 的作用域 new 一个 vue 实例在调用 vue router 的重定向方法,不知道楼下有没有更好的方法
shintendo
2018-12-21 16:44:32 +08:00
vuex 里保存当前登录用户信息,路由 beforeEach 里判断这个信息是否存在,若不存在则跳登录页,若存在则直接放行,不考虑登录是否失效的问题,由 axios 的拦截器处理登录失效
echol
2018-12-21 16:46:49 +08:00
默认只有未登录的路由,登陆后用 addRoutes 添加,需要的加上单独检测
shintendo
2018-12-21 16:49:20 +08:00
@ochatokori 可以在根组件的 created 里面给 axios 加拦截器的吧,这里可以访问 router
zjwshisb
2018-12-21 16:49:40 +08:00
@fourstring 可以啊,跟 4 楼的方法差不多,不过是全部交给了 axios 的拦截器,因为要登录的页面必然要请求某些 api,然后在 axios 的拦截器里面跳转登录页,就是会跳转两次页面,不过胜在省事
zjwshisb
2018-12-21 16:51:24 +08:00
@fourstring 在 axios 的拦截器里面 import vue-router 一样用的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/519789

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX