zoukankan      html  css  js  c++  java
  • 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 { }
  • 相关阅读:
    转:浅谈图片服务器的架构演进
    转:Spring AOP详解
    转:Spring AOP 注解方式实现的一些“坑”
    spring AOP自定义注解方式实现日志管理
    spring的普通类中如何取session和request对像
    spring session
    转:通过Spring Session实现新一代的Session管理
    转:一个Restful Api的访问控制方法(简单版)
    Python : 什么是*args和**kwargs[转载]
    tornado项目注意点
  • 原文地址:https://www.cnblogs.com/leiting/p/9447794.html
Copyright © 2011-2022 走看看