zoukankan      html  css  js  c++  java
  • 登录拦截设置白名单-坑

     需求

      登录拦截的时候我们一般会写一个permision.js放在main.js中,当页面每登录的时候会跳转到登录页面

    看代码:

    分析: 

      1、我这里设置了一个白名单数组 

    whiteList = ['/login', '/regist', '/'] // 不重定向白名单

    2、如果没登录,首先会从白名单里面去过滤,如果白名单有不需要跳登录页面,白名单没有直接跳登录页面

    // 没有登录
      } else {
        if (whiteList.indexOf(to.path) !== -1) {
          next()
        } else {
          // 还没有登录过 则跳转到登录界面
          next('/login')
        }
      }

    3、现在开始说我遇到的坑

      首先我试验几个indexOf的demo:

    console.log(whiteList = ['/login', '/regist', '/'].indexOf('/'))
    > 2
    undefined
    console.log(whiteList = ['/login', '/regist', '/'].indexOf('/login'))
    > 0
    undefined
    console.log(whiteList = ['/login', '/regist', '/'].indexOf('/login/'))
    > -1
    undefined
    console.log(whiteList = ['/login', '/regist', '/'].indexOf('/regist/'))
    >  -1

    当我打包后,(使用history模式打包的),刷新页面  to.path 取到的是 /login/,//regist/,所以导致了

    if (whiteList.indexOf(to.path) !== -1)

    条件不成立,直接跳到了

    } else {
          // 还没有登录过 则跳转到登录界面
          next('/login')
        }

    白名单没生效!!!

    但是我不打包在本地运行,to.path 末尾不会多一个/ ,是没问题的,由于有这个坑存在,我就弃用用白名单拦截的办法!

    附上白名单拦截的代码:
    import router from './router'
    import { getCookie } from './utils/auth'
    
    // 通过beforeEach钩子来判断用户是否登陆过 有无token
    const whiteList = ['/login/', '/regist/', '/'] // 不重定向白名单
    
    router.beforeEach((to, from, next) => {
      console.log(to.matched)
      // 判断是否有登录过
      if (getCookie('userId_dev')) {
        // 如果包含userId_dev 从登录页面跳转 直接跳转到首页 /
        if (to.path === '/login') {
          next('/smartHome/decIndex')
        } else {
          if (to.matched.length === 0) {
            next('/404') // 判断此跳转路由的来源路由是否存在,存在的情况跳转到来源路由,否则跳转到404页面
          }
          next() // 如果匹配到正确跳转
        }
      // 没有登录
      } else {
        if (whiteList.indexOf(to.path) !== -1) {
          next()
        } else {
          // 还没有登录过 则跳转到登录界面
          next('/login')
        }
      }
    })

    下面,我会用另外一种方法在登录拦截:不会产生to.path有两种情况出现的坑了

    代码如下:permision.js

    router.beforeEach((to, from, next) => {
      if (to.matched.some(record => record.meta.requireAuth)) { // 判断该路由是否需要登录权限
        // this route requires auth, check if logged in
        // if not, redirect to login page.
        if (!getCookie('userId_dev')) {
          next({
            name: 'login'
          })
        } else {
          next()
        }
        // if (to.matched.length === 0) {
        //   next({name: '404'}) // 判断此跳转路由的来源路由是否存在,存在的情况跳转到来源路由,否则跳转到404页面
        // }
      } else {
        next()  // 确保一定要调用next()
      }
    })

    route.js

    每个路由我都添加了一个meta属性

    requireAuth: true   // 需要登录才能进入的页面可以增加一个meta属性
    不需要登录验证的路由(‘/’,'login','/regist')我这里没有设置 requireAuth
    import Vue from 'vue'
    import Router from 'vue-router'
    // 布局组件
    import Layout from '@/pages/Layout/Layout'
    
    Vue.use(Router)
    ...
    const baseRoute = [
      { path: '/login', name: 'login', component: Login },
      { path: '/regist', name: 'regist', component: Regist },
      // 404page
      // { path: '/404', name: '404', component: page404 },
      {
        path: '/',
        name: 'home',
        component: Home
      },
      {
        path: '/smartHome',
        name: 'smartHome',
        redirect: '/smartHome/decIndex',
        component: Layout,
        children: [
          {
            path: 'decIndex',
            name: 'decIndex',
            component: ModeIndex,
            meta: {
              title: '', // 设备建模
              icon: '',
              requireAuth: true // 需要登录才能进入的页面可以增加一个meta属性
            }
          },
          {
            path: 'project',
            name: 'project',
            component: Project,
            meta: {
              dynamic: true, // 动态面包屑标题
              title: '',
              requireAuth: true // 需要登录才能进入的页面可以增加一个meta属性
            }
          },
          {
            path: 'project/onlineEquip',
            name: 'onlineEquip',
            component: OnlineEquip,
            meta: {
              title: '查看当前在线设备',
              level: 2,
              hidden: true,
              hasProdKey: false,
              requireAuth: true // 需要登录才能进入的页面可以增加一个meta属性
            }
          },
          {
            path: 'project/onlineEquip/debug',
            name: 'debug',
            component: Debug,
            meta: {
              title: '调试',
              level: 3,
              hidden: true,
              requireAuth: true // 需要登录才能进入的页面可以增加一个meta属性
            }
          },
          {
            path: 'project/onlineEquip/detail/:id',
            name: 'detail',
            component: Detail,
            meta: {
              title: '设备详情',
              level: 3,
              hidden: true,
              requireAuth: true // 需要登录才能进入的页面可以增加一个meta属性
            }
          },
          {
            path: 'project/log',
            name: 'log',
            component: Log,
            meta: {
              title: '日志',
              level: 2,
              hidden: true,
              requireAuth: true // 需要登录才能进入的页面可以增加一个meta属性
            }
          },
          {
            path: 'project/myPhyModel',
            name: 'CreateModel',
            component: CreateModel,
            meta: {
              title: '我的物解析模型',
              level: 2,
              hidden: true,
              requireAuth: true // 需要登录才能进入的页面可以增加一个meta属性
            }
          },
          {
            path: 'project/myPhyModel/detail',
            name: 'ModelDetail',
            component: ModelDetail,
            meta: {
              title: '模型详情',
              level: 3,
              hidden: true,
              requireAuth: true // 需要登录才能进入的页面可以增加一个meta属性
            }
          },
          {
            path: 'project/myPhyModel/debugModel', // 查看设备在线
            name: 'DebugModel',
            component: OnlineEquip, // 共用设备在线模块
            meta: {
              title: '查看当前在线设备',
              level: 4,
              hidden: true,
              hasProdKey: true,
              requireAuth: true // 需要登录才能进入的页面可以增加一个meta属性
            }
          }
        ]
      },
      {
        path: '*', // 页面不存在的情况下会跳到404页面
        name: '404',
        component: page404
      }
    ]
    const router = new Router({
      mode: 'history', // 预渲染一定要模式改成history
      routes: baseRoute
    })
    
    export default router

    这样打包以后也没有上面的问题啦!

    有遇到相同问题的同学可以留言交流 ^_^

  • 相关阅读:
    JQuery实现表格的全选和反选,以及分页勾选保存(laypage插件分页的使用)
    js之如何获取css样式
    JS正则表达式一些基本使用、验证、匹配、正则匹配时一个变量
    jQuery绑定事件的四种方式
    console命令详解
    实现a标签中的各种点击(onclick)事件的方法
    用JSON.parse和eval出现的问题
    js 将json对象转成字符串
    iOS主流机型更新
    * -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[0]’
  • 原文地址:https://www.cnblogs.com/mmzuo-798/p/10882955.html
Copyright © 2011-2022 走看看