zoukankan      html  css  js  c++  java
  • vue需要登录、不需要登录访问的页面,都在登录后回到之前的页面

    出现场景:最近在处理一个vue相关的阅读项目。有些页面(如首页)不需要登录可以查看,有些页面(书籍阅读页面)需要登录才能查看,但是,都想在登录之后返回到之前的页面。

    因为我这边需要登录的页面较多,不需要登录的页面较少,所以在router.js中的meta如下处理(即通过noNeedLogin控制):

    //首页
    {
      path: 'home',
      name: 'home',
      component: _import('Home'),
      meta: { noNeedLogin: true },
    },
    

    相关的路由守卫这样处理:

    router.beforeEach((to, from, next) => {
      if (!to.meta.noNeedLogin) { // 需要登录的页面处理
        if (window.localStorage.getItem('isLogin')) {
          next();
        } else {
          next({ path: '/form/userLogin', query: { redirect: to.fullPath } });
        }
      } else { // 不需要登录的页面处理
        next();
      }
    });
    

    但是上边的代码对不需要登录就可访问的页面没有用,就想着在else里面通过判断to.path==='/form/userLogin'来解决这个问题。最后导致页面死循环了,最后在登录页面使用了守卫解决。方案如下:

    <script>
      let redirectUrl; // 定义一个路由变量
      export default {
        ...
      }
    </script>
    

    然后在beforeRouteEnter中进行处理:

    <script>
      let redirectUrl;
      export default {
          beforeRouteEnter(to, from, next) {
            redirectUrl = from.fullPath;
            next(); // 这个不写的话无法显示登录页面
         }
      }
    </script>
    

    在登录请求完成之后跳转到上个页面:

    <script>
      let redirectUrl;
      export default {
        beforeRouteEnter(to, from, next) {
          if (to.query && to.query.redirect) {
            redirectUrl = to.query.redirect
          } else {
            redirectUrl = from.fullPath
          }
          next(); // 这个不写的话无法显示login页面
        },
        methods:{
          login() {
            ...
            this.$router.push(redirectUrl);
          }
        }
      }
    </script>
    

    但是此时有些页面在登录后是不需要跳回的,而是应该跳到首页的,比如从注册页面到登录页,登录之后不是回到注册页,而是跳转到首页,所以需要添加处理,用一个白名单:

    <script>
      let redirectUrl;
      // 不重定向白名单,比如从注册跳转到登录,登录之后应该到首页而不是回到注册页
      const whiteList = ['/form/userLogin', '/form/userRegister', '/form/resetPassword']
      export default {
        beforeRouteEnter(to, from, next) {
          if (to.query && to.query.redirect) {
            redirectUrl = to.query.redirect
          } else {
            redirectUrl = from.fullPath
          }
          next(); // 这个不写的话无法显示login页面
        },
        methods:{
          login() {
            ...
            let url = whiteList.indexOf(redirectUrl) === -1 ? redirectUrl : '/';
            this.$router.push(url);
          }
        }
      }
    </script>
    

    此篇文章引用:vue 需要登录、不需要登录访问的页面都在login后回到之前的页面

  • 相关阅读:
    6.7
    6.5
    6.4随笔
    js 插件
    js插件
    web中集成jdbc
    jsp
    web容器中的servlet
    web服务器的监听器,过滤器
    几款js工具的使用
  • 原文地址:https://www.cnblogs.com/AdolphWilliam/p/14931816.html
Copyright © 2011-2022 走看看