angular 路由守卫

  • 创建路由守卫

    • 创建路由(CanActivate、CanActivateChild、CanDeactivate)守卫的命令为:

      ng generate guard auth/auth(自定义)
    • 创建Resolve守卫的方式有些许不同。这个要用在一个服务中继承
    1、ng generate service test-resolve
    2、在生成的服务继承Resolve<T>方法,并实现。其中Person是一个类
    export class TestResolverService implements Resolve<Person> {
      constructor() { }
      resolve(route: import("@angular/router").ActivatedRouteSnapshot, state: import("@angular/router").RouterStateSnapshot):Observable<Person>{
        let p = new Person()
        // let p:Person只是声明一个变量而已,不是定义一个变量
        p.age="sdfsdfdsdsfsad"
        p.name="fsdfsd"
        return of(p)
      }
    }
  • 路由守卫的使用

    • 在使用ng generate guard auth/auth在创建守卫的时候,会出现选择实现那种守卫方式的选项,按需要选者即可
    • 在auth.guard.ts中实现CanActivate,CanActivateChild
      export class AuthGuard implements CanActivate,CanActivateChild{
      
        constructor(
          private authServic:AuthService,
          private router:Router
        ){}
        canActivate(
          next: ActivatedRouteSnapshot,
          state: RouterStateSnapshot): boolean{
          let url:string = state.url  //在跳转的时候获取
          console.log("URL:",url)
          return this.checkLogin(url);
        }
      
        checkLogin(url:string):boolean{
           // this.authServic.isLoggedIn是Boolean类型的变量
          if(this.authServic.isLoggedIn){
            return true;
          }
          console.log("checkLogin",url)
          this.router.navigate(["/login"])
          return false
        }
      
        // 子路由,用来控制子路由的被访问权限
        canActivateChild(childRoute: ActivatedRouteSnapshot, state: RouterStateSnapshot):boolean{
          // 都只是简单的进行判断是否登录,登录之后就不会重定向到login页面
          return this.canActivate(childRoute,state)
        }
      }
    • 在相对应的路由中使用。使用不同的路由守卫,在路由数组中使用不同的key进行区分(canActivate和canActivateChild)
      const routes: Routes = [
        {
          path:'admin',
          component:AdminComponent,
          canActivate:[AuthGuard],
          children:[
            {
              path:'',
              canActivateChild:[AuthGuard],
              children:[
                { path: 'crises', component: ManageCrisesComponent},
                { path: 'heroes', component: ManageHeroesComponent},
                { path: '', component: AdminDashboradComponent }
              ]
            }
          ]
        }
      ];
    • 使用canDeactivate守卫,有些特殊。实例化的该方法的方法如下所示
      export class CanDeactivateGuard implements CanDeactivate<TestComponent>  {
          //CanDeactivate<T>其中T是个泛型
        canDeactivate(component: TestComponent,
           currentRoute: ActivatedRouteSnapshot,
           currentState: RouterStateSnapshot,
           nextState?: RouterStateSnapshot): boolean{
          return window.confirm("sdfsdfsadfsda")
        }
      }
    • 在路由中使用的方法于之前的类似
      const routes: Routes = [
        {
          path:'admin',
          component:AdminComponent,
          children:[
            {
              path:'',
              canActivateChild:[AuthGuard],
              children:[
                { path: 'crises', component: ManageCrisesComponent,canDeactivate:[CanDeactivateGuard] },
                { path: 'heroes', component: ManageHeroesComponent},
                { path: '', component: AdminDashboradComponent }
              ]
            }
          ]
        }
      ];
    • 实例化resolve守卫。
      export class TestResolverService implements Resolve<Person> {
        constructor() { }
        resolve(route: import("@angular/router").ActivatedRouteSnapshot, state: import("@angular/router").RouterStateSnapshot):Observable<Person>{
          let p = new Person()
          // let p:Person只是声明一个变量而已,不是定义一个变量
          p.age="sdfsdfdsdsfsad"
          p.name="fsdfsd"
          return of(p)
        }
      }
    • resolve守卫的使用
      const routes: Routes = [
        {
          path:'admin',
          component:AdminComponent,
          children:[
            {
              path:'',
              children:[
                { path: 'crises', component: ManageCrisesComponent},
                { path: 'heroes', component: ManageHeroesComponent,resolve:{person:TestResolverService}},  //person的标识符可以是任意符合标识符的字符串,但一般都是于该路由发送的类型名字一致的字符串
                { path: '', component: AdminDashboradComponent }
              ]
            }
          ]
        }
      ];
  • 实现路由守卫的原理(CanActivate,CanActivateChild,CanDeactivate)
    • 守卫返回一个值,以控制路由器的行为

      • 如果它返回true,导航过程会继续
      • 如果他返回false,导航过程就会终止,且用户留在原地
      • 如果他返回UrlTree,则取消当前的导航,并且开始导航到返回的这个UrlTree中
  • 各个路由使用的大致场景
    • CanActivate:检查是否是登录状态访问页面;检查当前登录的用户是否权限访问这个页面(实现多角色多问题访问)
    • CanActivateChild:同上
    • CanDeactivate:当离开页面时候,修改了什么东西的时候,对用户进行访问是否保存
    • Resolve:在跳转到另一个页面的时候,先获取该页面需要的所有的值

原文地址:https://www.cnblogs.com/MyUniverse/p/11961957.html

时间: 2024-10-05 05:01:47

angular 路由守卫的相关文章

angular4.0 路由守卫详解

在企业应用中权限.复杂页多路由数据处理.进入与离开路由数据处理这些是非常常见的需求. 当希望用户离开一个正常编辑页时,要中断并提醒用户是否真的要离开时,如果在Angular中应该怎么做呢? 其实Angular路由守卫属性可以帮我们做更多有意义的事,而且非常简单. Angular 的 Route 路由参数中除了熟悉的 path.component 外,还包括四种是否允许路由激活与离开的属性. canActivate: 控制是否允许进入路由. canActivateChild: 等同 canActi

angularIO 路由守卫

引言 在企业应用中权限.复杂页多路由数据处理.进入与离开路由数据处理这些是非常常见的需求. 当希望用户离开一个正常编辑页时,要中断并提醒用户是否真的要离开时,如果在Angular中应该怎么做呢? 其实Angular路由守卫属性可以帮我们做更多有意义的事,而且非常简单. 什么是路由守卫? Angular 的 Route 路由参数中除了熟悉的 path.component 外,还包括四种是否允许路由激活与离开的属性. canActivate 控制是否允许进入路由. canActivateChild

Angular4 路由守卫

序言 在不设置路由守卫的时候,任何用户能在任何时候导航到任何地方的,但是在某些场景为了安全,我们需要登录的用户才能导航到对应的页面.这时候我们需要给组件添加路由守卫. 步骤 1.分层路由介绍 CanActivate:处理导航到某路由的情况 CanActivateChild:处理导航到某子路由的情况 CanDeactivate:处理从当前路由离开的情况 Resolve:在路由激活之前获得路由数据 CanLoad:处理异步导航到某特性模块的情况 2.声明 这里的路由守卫使用与Angular-cli使

Angular4.x通过路由守卫进行路由重定向,实现根据条件跳转到相应的页面

需求: 最近在做一个网上商城的项目,技术用的是Angular4.x.有一个很常见的需求是:用户在点击"我的"按钮时读取cookie,如果有数据,则跳转到个人信息页面,否则跳转到注册或登录页面 解决 在这里通过Angular的路由守卫来实现该功能. 1. 配置路由信息 const routes = [ { path: 'home', component: HomeComponent }, { path: 'product', component: ProductComponent },

Angular路由的定义和使用

一.什么是routing(路由) Almost all non-trivial, non-demo Single Page App (SPA) require multiple pages. A settings page is different from a dashboard view. The login page is different from an accounts page(设置页面不同于控制页面,登录页面不同于账号信息页面....就是说一个应用很多功能不同的页面) 我们可以使

angular路由详解:

1.$routeProvider ngRoute模块中的服务 2.otherwise:设置用于路由改变时,与任何其他定义的路由无法匹配的时候执行的代码 3.when:为$route服务定义新的路由 例 var app=angular.module('myApp',['ngRoute']); //配置angular路由//$routeProvider是ngRoute模块中的服务 app.config(function($routeProvider){ //when:第一个值是配置路由的名称,第二个

angular路由(自带路由篇)

一.angular路由是什么? 为了实现SPA多视图的切换的效果,其原理可简述为每个 URL 都有对应的视图和控制器.所以当我们给url后面拼上不同的参数就能通过路由实现不同视图的切换. 二.文件总览 1.新建文件 一级目录新建ngRoute.html(为主页面,里面进行路由配置) 一级目录新建view文件夹,里面再新建三个子页面aboutus.html,home.html,order.html 一级目录存放angular.js和angular-route.js文件,文件存放位置依自己喜好即可

angular 路由去除#号

1.  路由启动          $locationProvider.html5Mode(true); app.js define([ 'angular', "App/Ctrl/controllers", "App/Directive/directive", "angularRoute" ], function (angular,controllers,directives,appDirec) { var app=angular.module(

路由守卫

路由守卫 CanActivate  | 处理导航到某路由的情况-阻止或允许用户进入组件 CanDeactivate  | 处理从当前路由离开的情况-用户离开时 Resolve  | 在路由激活之前获取路由数据-在组件绑定的属性还没有被赋值时会报错,这个守卫就是解决这个问题的 CanActivate 1.需要新建一个 XX.guard.ts 文件 2.在这个.ts 文件里导入 CanActivate 模块 ... 长这样: canActivate(){}  这个方法 return true 用户就