判断浏览器缓存是否有token信息,没有的话跳转登录页,直接陷入了死循环

    1. NProgress.configure({ showSpinner: false })
    2. const whiteList = ['/login','/regist', '/test'] // 不重定向白名单
    3. router.beforeEach((to, from, next) => {
    4. NProgress.start()
    5. if (getToken()) { //是否有token
    6. if (to.path === '/login' || to.path=='/regist'|| to.path == '/test') {
    7. next()
    8. NProgress.done()
    9. } else {
    10. //此处可作拦截处理其它
    11. next()
    12. NProgress.done() // 结束Progress
    13. }
    14. } else {
    15. next(`/login?redirect=${to.path}`) // 否则全部重定向到登录页
    16. }
    17. })
    18. router.afterEach(() => {
    19. NProgress.done() // 结束Progress
    20. })

    原因是由于 next(/login?redirect=${to.path})是自己指定路径的,中断跳转,再路由跳转的时候还执行一遍beforeEach导航钩子,所以上面出现死循环;
    再加个判断就OK了

    1. NProgress.configure({ showSpinner: false })
    2. const whiteList = ['/login','/regist', '/test'] // 不重定向白名单
    3. router.beforeEach((to, from, next) => {
    4. // next()
    5. NProgress.start()
    6. if (getToken()) {
    7. if (to.path === '/login' || to.path=='/regist'|| to.path == '/test') {
    8. next()
    9. NProgress.done()
    10. } else {
    11. //此处可作拦截处理其它
    12. next()
    13. NProgress.done()
    14. }
    15. } else {
    16. if (whiteList.indexOf(to.path) !== -1) {
    17. next()
    18. } else {
    19. next(`/login?redirect=${to.path}`) // 否则全部重定向到登录页
    20. NProgress.done()
    21. }
    22. }
    23. })
    24. router.afterEach(() => {
    25. NProgress.done() // 结束Progress
    26. })

    因为一开始在else里面没有做判断,那么他的条件一直未改变,所以他会一直重复next到login才造成的死循环,后面写了判断之后就正常了

    正确思路应该是:
    判断是否token有效,如果无token,进入else,在else中再做处理:判断是否在白名单中,如在白名单中直接放行,不在则重定向到登录页。