• 全局路由拦截、局部路由拦截


    引入: 

    看下面这个效果: 

    每次我们在点击一个功能时,它就会跳转到登录页面,意思就是让我们先登录,登录之后再进行功能操作;但是如果我们登录了,它就不会跳转,这是什么原理呢;

    运用的原理:在路由跳转之前,进行拦截检查是否登录,如果没有登录就跳转登录页面,如果登录了就不跳转登录页面。此时就用到了:路由拦截 


    如何拦截:

    • 路由拦截分为:全局路由拦截、局部路由拦截;

    (1)全局路由拦截:

    1. const router = new VueRouter({
    2. mode: 'history',
    3. routes
    4. })
    5. // 全局拦截
    6. router.beforeEach((to, from, next) => {
    7. if (需要拦截验证的路由) {
    8. if (验证成功) {
    9. // next():不拦截,放行
    10. next()
    11. } else {
    12. next('/login')
    13. }
    14. } else {
    15. next()
    16. }
    17. })
    • 拦截方法:router.beforeEach(回调函数),每个路由跳之前都会执行这个函数;
    • 回调函数有三个参数:to、from、next,
    • to是跳转后路由,from是跳转前路由,next是个函数;
    • next是一个函数,含义是:不需要拦截的路由通行;
    • 并不需要对所有路由进行拦截,不需要拦截的就next()

    拦截思路:(对上述代码进行解释)

    路由需要拦截就走外围if,不许要拦截就走外围else,通过next()放行;如果拦截的路由授权通过了,就走next()放行,没有授权通过就跳转到某个页面去执行某个功能,去授权。

    拿登录案例来理解:

    如果点一个功能需要验证是否注册登录,那就拦截下来;不需要验证那就不拦截就走外层else;里层的判断:拦截下来的路由,判断你是否登录,没登录那就else去登录,if登录了那就走next()放行。

    案例演示:

    现在要求是要拦截 path为 “/center”和“/order”的路由,其他的不拦截;拦截的路由需要判断是否登录;

    (1)外层if判断代码:

    • 首先给要拦截的路由加上 meta 
    1. // 配置表,将路径和组件一一对应配置好
    2. const routes = [
    3. {
    4. path: '/films',
    5. component: FilmsView
    6. },
    7. {
    8. path: '/cinemas',
    9. component: CinemasView
    10. },
    11. {
    12. path: '/center',
    13. component: CenterView,
    14. meta: {
    15. isKerwinRequired: true
    16. }
    17. },
    18. {
    19. path: '/order',
    20. component: OrderView,
    21. meta: {
    22. isKerwinRequired: true
    23. }
    24. }
    25. ]
    • meta里面名字随便起,传一个true值,默认不写是false; 

    此时打印一下 to 的值:

    console.log(to)

    没加meta之前的结果:

    加了meta之后的结果: 

    此时需要拦截的路由的meta都是true,那外层的if语句条件不就有了:(这就话的思路就是给需要拦截的加“特殊标记”呗。)

    if (to.meta.isKerwinRequired){}

    (2)里层if代码: 

    现在是拦截好路由了,接下来判断是否登录;

    • 是否登录的条件思路是:看有没有本地存储的登录信息:
    if (localStorage.getItem('token'))//有token信息,就说明已经登录过了

    最终的完整代码:

    1. // 全局拦截
    2. router.beforeEach((to, from, next) => {
    3. if (to.meta.isKerwinRequired) {
    4. // 判断 本地存储中是否token
    5. if (localStorage.getItem('token')) {
    6. // next():不拦截,放行
    7. next()
    8. } else {
    9. next('/login')//跳转到登录页面
    10. }
    11. } else {
    12. next()
    13. }
    14. })
    • “/login” 是登录路由需要配置 

     (2)局部路由拦截:

    • 在需要拦截的路由内部写代码:
    1. {
    2. path: '/order',
    3. component: OrderView,
    4. meta: {
    5. isKerwinRequired: true
    6. },
    7. beforeEnter: (to, from, next) => {
    8. if (localStorage.getItem('token')) {
    9. // next():不拦截,放行
    10. next()
    11. } else {
    12. next('/login')
    13. }
    14. }
    15. }
  • 相关阅读:
    T1094 与7无关的数(信息学一本通C++)
    水表数字识别5:Android实现水表数字识别(含源码 可实时检测)
    1.django简介及安装
    HarmonyOS云开发基础认证【最新题库 满分答案】
    【基于Qt和OpenCV的多线程图像识别应用】
    雅思 听力
    Linux【yum】【git】【gdb】
    7-7 六度空间
    使用git发布(删除/更改)GitHub仓库中的内容
    Java 并发编程解析 | 如何正确理解Java领域中的锁机制,我们一般需要掌握哪些理论知识?
  • 原文地址:https://blog.csdn.net/a1598452168YY/article/details/128119377