• vue设置cookie和路由守卫


    vue项目中登录页面用户登录成功后,会把用户信息存储到cookie中,然后跳转进入首页,当用户没有登录时,直接输入页面地址会经过路由守卫检测cookie中是否存在用户信息,如果不存在,重定向到登录页让用户进行登录。接下来从配置cookie方法开始。

    首先在项目中新建util/cookie.js文件作为存放cookie方法的js

    img

    在cookie.js中写进如下代码,该代码封装的三个方法,setCookie:存储cookie; getCookie:读取cookie; clearCookie:删除指定cookie;最后把这三个方法导出,便于全局调用,每行代码具体什么意思可观看以下教程:cookie教程一cookie教程,讲解的非常详细。

    [复制代码](javascript:void(0)😉

    /**
     * @description 保存cookie
     * @param {Object} json 需要存储cookie的对象
     * @param {Number} days 默认存储多少天
     */
    function setCookie(json, days) {
        // 设置过期时间
        let data = new Date(
            new Date().getTime() + days * 24 * 60 * 60 * 1000
        ).toUTCString();
    
        for (var key in json) {
            document.cookie = key + "=" + json[key] + "; expires=" + data;
        }
    }
    
    /** 
     * @description 获取cookie
     * @param {String} name 需要获取cookie的key
     */
    function getCookie(name) {
        var arr = document.cookie.match(new RegExp("(^| )" + name + "=([^;]*)(;|$)"));
        if (arr != null) {
            return unescape(arr[2])
        } else {
            return null
        }
    }
    
    /** 
     * @description 删除cookie
     * @param {String} name 需要删除cookie的key
     */
    function clearCookie(name) {
        let json = {};
        json[name] = '';
        setCookie(json, -1)
    }
    
    export default {
        setCookie,
        getCookie,
        clearCookie
    }
    
    • 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
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    [复制代码](javascript:void(0)😉

    然后在main.js中引入刚刚写好的cookie.js,并通过Vue.prototype设置cookie这个字段作为全局变量

    img

    引入完毕之后就可以在任意页面中通过 this.cookie.方法名(值)来增删查cookie。

    this.cookie.setCookie() //存cookie

    this.cookie.getCookie() //读cookie

    this.cookie.clearCookie() //删cookie

    首先在项目中创建登录页Login.vue编写登录页面,登陆成功之后通过this.cookie.setCookie往cookie中存入用户信息。

    [复制代码](javascript:void(0)😉

    
    
    
    
    • 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
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53

    [复制代码](javascript:void(0)😉

    登陆成功之后再浏览器的cookie中可以看到存进去的LoginName,openId,以及他们的过期时间。

    img

    imgimg

    登录成功我们跳转到了home.vue页面,通过this.getCookie( “LoginName” )获取一下登录名。

    img

    img

    然后点击退出的时候需要清除一下cookie,然后返回登录页。

    img

    点击退出之后清除cookie,并且跳转到了登录页面,现在去查看cookie

    img

    发现里面是空白的。

    至此我们第一步基本完成了,接下在跳转时要验证cookie里面是否有登录信息,如果没有则不让跳转并且跳转到登录页。也就是要用到路由守卫。

    上一篇我们已经封装好了cookie方法,登录成功之后也可以吧用户信息存到cookie中,接下来需要在router/index.js中引入一下cookie.js文件

    img

    然后继续添加以下代码

    /*
    
    \* beforeEach:从一个页面跳转到另外一个页面时触发
    
    \* to:要跳转的页面
    
    \* from:从哪个页面出来
    
    \* next:决定是否通过
    
    */
    
    router.beforeEach((to, from, next) => {
    
     // 如果跳转的页面不存在,跳转到404页面
    
     if(to.matched.length===0){
    
      next('/404')
    
     }
    
     if (cookie.getCookie("openId")) {
    
      next()
    
     } else {  
    
      if (to.path === "/Login") {
    
       next()
    
      } else {
    
       next('/Login')
    
      }
    
     }
    
    })
    
    • 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
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    [复制代码](javascript:void(0)😉

    img

    router.beforeEach意思是在router.index设置了一个全局守卫,只要发生页面跳转,会执行里面的代码,首先先去判断跳转的页面是否存在,如果不存在进到404页面,然后调用cookie.getCookie()方法读取用户信息,如果不存在代表没有登录,用next(‘/Login’)进入Login登录页面进行登录,如果读取到了用户信息,不做拦截直接放行。

    img

    img

    img

    扩展

    全局后置钩子

    router.afterEach((to,from)=>{})表示从当前页面离开时进行判断,一般用来跳转页面时提示用户是否离开该页面。

    路由独享的守卫

    beforeEnter:(to,from,next)=>{},用法与全局守卫一致。只是,将其写进其中一个路由对象中,只在这个路由下起作用。

    img

  • 相关阅读:
    数据结构 - 6(优先级队列(堆)13000字详解)
    【理解线性代数】(四)从向量组点乘到矩阵相乘
    Windows 环境下 MySQL Server 清空 Log 文件命令
    这是一个lonely的问题——二进制
    第一次使用idea运行报错,说构建失败
    PyQt5快速开发与实战 9.7 UI层的自动化测试
    深度学习自学笔记十四:图像分割的简单网络介绍
    Numpy 实现全连接神经网络
    RV1126 快速启动
    DNS网络故障排除命令dig&nslookup
  • 原文地址:https://blog.csdn.net/s_frozen/article/details/126262949