之前项目中用来判断是否登录我写了多种方案,但是最终只有一个方案是比较好的,这篇博客就是分享该方案;

先说基本要求:

  • 项目中的登录状态是依据服务器里的状态来作为判断依据;
  • 每一个需要登录后才能操作的接口,如果未登录都会返回未登录的错误;
  • 项目中使用 vuex,axios,router;

判断登录方案需要满足下面几点:

  1. 未登录状态下的刷新:

    1.1 在需要登录页面中刷新是需要跳转到登录页的;

    1.2 在不需要登录的页面中刷新,不需要跳转;
  2. 在未登录状态下,跳转到需要登录页面时,会直接跳转到登录页;

先在路由文件里修改:

export default {
path: '/person',
component: person,
name: 'person',
redirect: 'person/index',
meta:{
requireLogin:true,
},
children: [
//子页面
]
}

假如上面的代码是一个用户中心的路由,他是主页面,其他都是他的子页面,那么只需要在meta里添加requireLogin:true一次就行了,子页面不需要修改什么;


在 main.js 里添加:

axios.interceptors.response.use(
response => {
if(response.data.code === 500) {
if (response.data.msg === '请先登录') {
router.push({
path: '/login',
query: {redirect: router.history.current.fullPath}
})
//如果需要可以在这里将 vuex 里的 user 改为空对象
}
//显示错误信息
return Promise.reject(response.data)
} if(response.data.code === 0){
return response;
}
}, error => {
//显示错误信息
return Promise.reject(error.response.data)
}); router.beforeEach((to, from, next) => {
let user = router.app.$options.store.state.user;
if (to.matched.some(record => record.meta.requireLogin)) {
if (JSON.stringify(user) === '{}') {
next();
router.push({ path: '/login',query: { redirect: to.fullPath }})
}else {
next()
}
} else {
next()
}
});

根据 user 是否为一个空对象来判断本地登录状态;


在 app.vue 里添加:

created(){
this.$store.dispatch('getUser');
}

每一次刷新都会触发该函数,作用是判断登录状态和获取最新的信息;


在 vuex/index 添加:

const store = new Vuex.Store({
state: {
user: JSON.parse(localStorage.user || '{}'),
},
mutations: {
changeUser(state, msg){
state.user = msg;
},
},
actions: {
getUser({commit}){
axios.get(api.info).then(data => {
commit('changeUser', data.data.member);//需根据实际修改
localStorage.user = JSON.stringify(data.data.member || {});
}).catch(err => {
commit('changeUser', {});
if (router.currentRoute.matched.some(record => record.meta.requireLogin)) {
router.push({
path: '/login',
query: {redirect: router.currentRoute.fullPath}
})
}
})
},
}
})

在某页面下刷新,可以根据是否为需登录页面进行判断,并且已登录可以更新用户信息;

用户的信息都是存储在 localStorage 里来成为默认值,但是 ajax 连接失败的话,会变为空;

!!注意!!

上面的方法适用的是,不知道后台的登录保存时间,然而,如果你知道后台的登录状态保存时间的话,我想可以有一种更好的方法,即 cookie

因为 cookie 会有一个保存的时间, 进入一个页面判断是否存在;

还可以使用 Web Workers ,在后台添加一个计时器,每一段时间判断 cookie 是否存在,不过 cookie 能存储的东西不多,还有 IE 对Web Workers 是不支持的,所以最好在 main 里判断一下页面是否对 web workers ;

放下我之前项目所用的登录检查方式:

let hasLogin = false // 是否登录过
// 登录拦截
router.beforeEach((to, from, next) => {
if (document.cookie.includes('userName')) {
hasLogin = true
if (permission.indexOf(to.path) > -1) {
next()
} else {
try {
// 简单的权限判断
let routesKey = Cookie.get('routesKey').split(',')
let key = to.path.split('/')[1]
if (routesKey.indexOf(key) > -1) {
next()
} else {
next({path: '/'})
}
} catch (e) {
next({path: '/login'})
}
}
} else {
if (to.path === '/login') { // 如果是登录页面路径,就直接next()
next()
} else {
if (hasLogin) {
Cookie.clear('userName')
ELEMENT.Message({
message: '登录失效,请重新登录!',
center: true,
type: 'warning'
})
}
next({path: '/login', query: {redirect: to.fullPath}})
}
}
})

完;

vue用户登录状态判断的更多相关文章

  1. C# MVC 用户登录状态判断 【C#】list 去重(转载) js 日期格式转换(转载) C#日期转换(转载) Nullable<System.DateTime>日期格式转换 (转载) Asp.Net MVC中Action跳转(转载)

    C# MVC 用户登录状态判断   来源:https://www.cnblogs.com/cherryzhou/p/4978342.html 在Filters文件夹下添加一个类Authenticati ...

  2. C# MVC 用户登录状态判断

    来源:https://www.cnblogs.com/cherryzhou/p/4978342.html 在Filters文件夹下添加一个类AuthenticationAttribute ,代码如下: ...

  3. iOS开发之记录用户登录状态

    iOS开发之记录用户登录状态 我们知道:CoreData的配置和使用步骤还是挺复杂的.但熟悉CoreData的使用流程后,CoreData还是蛮好用的.今天要说的是如何记录我们用户的登陆状态.例如微信 ...

  4. Asp.Net使用加密cookie代替session验证用户登录状态 源码分享

    首先 session 和 cache 拥有各自的优势而存在.  他们的优劣就不在这里讨论了. 本实例仅存储用户id于用户名,对于多级权限的架构,可以自行修改增加权限字段   本实例采用vs2010编写 ...

  5. SpringBoot29 登录逻辑、登录状态判断

    1 知识点扫盲 浏览器和服务器之间时通过session来确定连接状态的,浏览器第一次请求时服务端会自动生成一个session,并将这个sessionId传回给浏览器,浏览器将这个sessionId存放 ...

  6. Django 用Session和Cookie分别实现记住用户登录状态

    简介 由于http协议的请求是无状态的.故为了让用户在浏览器中再次访问该服务端时,他的登录状态能够保留(也可翻译为该用户访问这个服务端其他网页时不需再重复进行用户认证).我们可以采用Cookie或Se ...

  7. 基于cookie的用户登录状态管理

    cookie是什么 先来花5分钟看完这篇文章:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Cookies 看完上文,相信大家对cookie已经有 ...

  8. vue 根据接口返回的状态码判断用户登录状态并跳转登录页,登录后回到上一个页面(http拦截器)

    背景:后台接口返回code==501表示用户是未登录状态,需要登录才可访问: 通过http拦截做路由跳转 第一步:src目录下新建http.js文件,内容如下: import Axios from ' ...

  9. iOS - 记住用户登录状态保存用户名密码

    我们在使用APP时常用的一个功能:用户第一次进入APP时自动进入登录注册页,提示用户注册登录,用户登录成功后才进入主页,再次进入APP时,不用再次登录就直接进到主页了,就算杀掉该APP进程再次进入,依 ...

随机推荐

  1. NYOJ-851寻找最大数(二),栈贪心!

    寻找最大数(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 给你一个数字n(可能有前缀0). 要求从高位到低位,进行 进栈出栈 操作,是最后输出的结果最大. 输入 ...

  2. vim状态栏的扩充

    将以下内容添加到~/.vimrc文件中: set statusline= set statusline+=%7*\[%n]                                  " ...

  3. poj——1422 Air Raid

    Air Raid Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 8577   Accepted: 5127 Descript ...

  4. codevs——2147 数星星

    2147 数星星  时间限制: 3 s  空间限制: 64000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description 小明是一名天文爱好者,他喜欢晚上看星星 ...

  5. 旧瓶新酒之ngx_lua & fail2ban实现主动诱捕

    服务器承担着业务运行及数据存储的重要作用,因此极易成为攻击者的首要目标.如何对业务服务器的安全进行防护,及时找出针对系统的攻击,并阻断攻击,最大程度地降低主机系统安全的风险程度,是企业安全从业人员面临 ...

  6. javascript statically scope

    在javascript 里面, 函数中使用的未定义的变量,会默认变为全局的变量. 而通过 var 这个关键字定义的变量,就是局部变量. As far as the output is concerne ...

  7. Good Zookeeper Tutorial with Java client

    参考: https://stackoverflow.com/questions/33524537/good-zookeeper-tutorial-with-java-client I was tryi ...

  8. webpack-入口篇

    入口起点[Entry Points]: 单个入口(简写)语法 用法:entry: string|Array<string> 例子(webpack.config.js) const conf ...

  9. react组件是怎么来的

    组件的创造方法为React.createClass() ——创造一个类,react系统内部设计了一套类系统,利用它来创造react组件.但这并不是必须的,我们还可以用es6的class类来创造组件,这 ...

  10. iOS xcode6最新提交app方法

    依照之前方式打包.打包成功后.直接submit提交AppStore.然后再选择build,假设上传成功,但在build选择上未出现,你能够耐心等待.有可能要等上一天,然后选择相应的build,直接提交 ...