angular 2+ 路由守卫

1. 定义接口名称 /domain/login-guard.ts

export interface LoginGuard {
  data: any;
  msg: string;
  status: boolean;
}

2. 定义actions  /ngrx/actions/login-guard.action.ts

import { Action } from ‘@ngrx/store‘;
import {LoginGuard} from ‘../../domain/login-guard‘;

/**
 * For each action type in an action group, make a simple
 * enum object for all of this group‘s action types.
 */
export enum ActionTypes {
  GUARD = ‘[GUARD]‘
};

/**
 * Every action is comprised of at least a type and an optional
 * payload. Expressing actions as classes enables powerful
 * type checking in reducer functions.
 */
export class GuardSuccess implements Action {
  readonly type = ActionTypes.GUARD;

  constructor(public payload: LoginGuard) { }
}

/**
 * Export a type alias of all actions in this action group
 * so that reducers can easily compose action types
 */
export type Actions
  = GuardSuccess;

3. 定义reducers  /ngrx/actions/login-guard.reducer.ts

import * as fromLogin from ‘../actions/login-guard.action‘;
import {LoginGuard} from ‘../../domain/login-guard‘;

export interface State {
  guard: LoginGuard;
}

export const initialState: State = {
  guard: {
    data: ‘‘,
    msg: ‘‘,
    status: true
  }
};

export function reducer(state = initialState, action: fromLogin.Actions): State {
  switch (action.type) {
    case fromLogin.ActionTypes.GUARD: {
      return {...state, guard: action.payload};
    }
    default: {
      return state;
    }
  }
}

4. login.service.ts

import {Injectable} from ‘@angular/core‘;
import {ActivatedRouteSnapshot, NavigationEnd, Router, RouterStateSnapshot} from ‘@angular/router‘;
import {Observable} from ‘rxjs/Observable‘;
import ‘rxjs‘;
import {HttpClient} from ‘@angular/common/http‘;
import * as fromReducer from ‘../ngrx/reducers/index‘;
import {Store} from "@ngrx/store";
import {GuardSuccess} from ‘../ngrx/actions/login-guard.action‘;

export class LoginService {

  constructor(private router: Router, private http: HttpClient, private store$: Store<fromReducer.State>) {
  }

// canActivate: 控制是否允许进入路由。
  canActivate(route: ActivatedRouteSnapshot,
              state: RouterStateSnapshot): boolean | Observable<boolean> | Promise<boolean> {
    return this.activate();
  }

// 在登陆的时候会把登陆信息存到浏览器localStorage,退出登陆时remove掉,如果是直接打开地址而没有登陆的话,会跳到登陆界面,judgeuser是请求用户信息接口,setUserInfo()把请求到的信息存到浏览器
  activate(): Observable<boolean> {
    const url = `${environment.path}/judgeUser`;
    const params = JSON.parse(localStorage.getItem(‘LOGININFO‘));
    const param = {
      emNumber:params.emNumber,
      emPhone:params.emPhone
    }
    return this.http.post(url, param).map((guard: LoginGuard) => {
      const guard$ = guard;
      if (!guard$.status) {
        this.router.navigate([‘/‘]);
      }
      setUserInfo(guard$);
      this.store$.dispatch(new GuardSuccess(guard$));
      return guard$.status;
    });
  }

}

5. service注入

import {LoginService} from ‘./service/login.service‘;
@NgModule({
  declarations: [
    AppComponent,
    DemoComponent,
    // HtmlPipe
  ],
  imports: [
    BrowserAnimationsModule,
    AppRoutingModule,
    ViewModule,
    ShareModule,
    AppStoreModule,
    HttpClientModule,
    DirectivesModule,
  ],
  providers: [LayerService, InterfaceService, LoginService, {
    provide: LocationStrategy,
    useClass: HashLocationStrategy
  }],
  bootstrap: [AppComponent]
})
export class AppModule { }

原文地址:https://www.cnblogs.com/leiting/p/9447794.html

时间: 2024-08-05 09:05:23

angular 2+ 路由守卫的相关文章

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

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

angular 路由守卫

创建路由守卫 创建路由(CanActivate.CanActivateChild.CanDeactivate)守卫的命令为: ng generate guard auth/auth(自定义) 创建Resolve守卫的方式有些许不同.这个要用在一个服务中继承 1.ng generate service test-resolve 2.在生成的服务继承Resolve<T>方法,并实现.其中Person是一个类 export class TestResolverService implements R

angular4.0 路由守卫详解

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

Angular4 路由守卫

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

angularIO 路由守卫

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

路由守卫

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

vue的生命周期和路由守卫

组件相关钩子函数: beforeCreate.created.beforeMount.mounted.beforeUpdate.updated.beforeDestroy.destoryed 还有两个特殊的(使用keep-alive):activated.deactivated(不详述) v2.5.0+新增: errorCaptured (暂时还不知道咋用) 路由守卫: 全局&路由独享:beforeEach.beforeResolve(v2.5.0+新增).afterEach :beforeEn

nuxtjs中使用路由守卫

在vue中的路由守卫一般是来验证token失效什么的,当然也可以设置权限啦,在nuxtjs中如何使用路由守卫呢,话不多说,直接上代码 在plugins目录下简历route.js export default ({ app }) => { app.router.afterEach((to, from) => { console.log(to.path) }) } 然后在 nuxt.config.js中添加配置plugins即可 plugins: [ '@/plugins/element-ui',

Vue路由及路由守卫

1. Vue路由的添加 vue cli3添加vue-router通过命令vue  add  router export default new Router({ mode: 'history', routes: [ { path: '/', component: Main }, { path: '/login', component: Login } ] }) // app.vue <div id="app"> <router-view></router-