• Angular路由守卫


    路由守卫

    简介

    目前,任何用户都能在任何时候导航到任何地方,对于大部分应用,这样是存在安全问题的,某些用户可能无权导航到目标组件,需要先登录(认证)

    在显示目标组件前,可能需要先获取某些数据。

    在离开组件前,可能要先保存修改.需要询问用户:是否要放弃本次更改,而不用保存它们?

    对于上述这些场景问题,往往需要在路由配置中添加守卫,进行处理.

    返回值

    守卫通过返回一个值,以控制路由器的行为:

    • 如果它返回 true,导航过程会继续

    • 如果它返回 false,导航过程就会终止,且用户留在原地。

    • 如果它返回 UrlTree,则取消当前的导航,并且开始导航到返回的这个 UrlTree.

    守卫还可以告诉路由器导航到别处,这样也会取消当前的导航。要想在守卫中这么做,就要返回 false;

    守卫可以用同步的方式返回一个布尔值,但在很多情况下,守卫无法用同步的方式给出答案.守卫可能会向用户问一个问题、把更改保存到服务器,或者获取新数据,而这些都是异步操作。因此,路由的守卫可以返回一个Observable Promise,并且路由器会等待这个可观察对象被解析为true或false。

    提供给路由器的可观察对象还必须能结束,否则,导航就不会继续.

    守卫接口

    路由器可以支持多种守卫接口:

       * 用CanActivate来处理导航到某路由的情况。
    
       * 用CanActivateChild来处理导航到某子路由的情况。
    
       * 用CanDeactivate来处理从当前路由离开的情况.
    
       * 用Resolve在路由激活之前获取路由数据。
    
       * 用CanLoad来处理异步导航到某特性模块的情况。
    

    在分层路由的每个级别上,你都可以设置多个守卫,上面提到过的空路由,在这里会可能发挥很好的作用

    路由器会先按照从最深的子路由 由下往上检查的顺序来检查CanDeactivate() 和CanActivateChild() 守卫.然后它会按照从上到下的顺序检查CanActivate()守卫. 如果特性模块是异步加载的,在加载它之前还会检查CanLoad()守卫. 如果任何一个守卫返回 false,其它尚未完成的守卫会被取消,这样整个导航就被取消.

    使用

    • 生成一个守卫
    //添加一个auth守卫
    ng generate guard auth    (简写ng g g auth/auth)
    

    生成的守卫会自动实现canactivate,若异步加载模块的,还需要实现CanLoad
    在守卫里进行安全的逻辑设置,可以用与服务结合实现

    export class AuthGuard implements CanActivate{}
    
    • 添加进路由(假设访问info界面需要登录)
    { path: 'info', canActivate: [AuthGuard], component: WorkComponent },
    
    由于无法解释的神圣旨意,我们徒然地到处找你;你就是孤独,你就是神秘,比恒河或者日落还要遥远。。。。。。
  • 相关阅读:
    穿透层的鼠标事件
    深入浅出HTML与XHTML的区别
    JQuery中一个简单的表单验证的实例
    JavaScript window.setTimeout() 的详细用法
    js动态创建及移除div的方法
    js插入节点appendChild和insertBefore
    sublime使用方法
    js移动客户端--触屏滑动事件
    jquery 延迟执行实例介绍
    JS页面延迟执行一些方法(整理)
  • 原文地址:https://www.cnblogs.com/momoli/p/14061197.html
Copyright © 2020-2023  润新知