• angular中的 登录检查 和 过期Session清理


    angular利用ui-router进行登录检查

    SAP都会有这个问题,session过期或者页面被刷新的情况下应该进入登录页.

    监听ui-router的satte事件可以实现当state切换的时候检查登录情况

    监听state变化处理页面刷新

        //添加事件监听
        $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) {
            if (toState.name == 'register') return; // 如果是进入登录界面则允许
            // 如果用户不存在
            if (!$rootScope.session || !$rootScope.seccion.session_id) {
                event.preventDefault(); // 取消默认跳转行为
                $state.go("register", { from: fromState.name, w: 'notLogin' }); //跳转到登录界面
            }
        });
    
    

    HttpProvider的Interceptor处理过期session

    intercepto拦截器,可以处理所有的请求结果,能够实现:基于状态码统一的错误处理
    如何注册interceptor:https://docs.angularjs.org/api/ng/service/$http#interceptors

    //register interceptor as sercice
    app.factory('UserInterceptor', ["$q","$rootScope",function ($q,$rootScope) {
        return {
            request:function(config){
                config.headers["TOKEN"] = $rootScope.user.token;
                return config;
            },
            responseError: function (response) {
                var data = response.data;
                // 判断错误码,如果是未登录
                if(data["errorCode"] == "500999"){
                    // 清空用户本地token存储的信息
                    $rootScope.user = {token:""};
                    // 全局事件,方便其他view获取该事件,并给以相应的提示或处理
                    $rootScope.$emit("userIntercepted","notLogin",response);
                }
                // 如果是登录超时
                if(data["errorCode"] == "500998"){
                    $rootScope.$emit("userIntercepted","sessionOut",response);
                }
                return $q.reject(response);
            }
        };
    }]);
    
    //push interceptor to interceptor list
    app.config(function ($httpProvider) {
        $httpProvider.interceptors.push('UserInterceptor');
    });
    
    $rootScope.$on('userIntercepted',function(errorType){
        // 跳转到登录界面,这里我记录了一个from,这样可以在登录后自动跳转到未登录之前的那个界面
        $state.go("login",{from:$state.current.name,w:errorType});
    });
    

    相关

    UI-State Events
    $stateChangeCancel
    $stateChangeError
    $stateChangeStart
    $stateChangeSuccess
    $stateNotFound

    Directive Hooks

    详情:https://docs.angularjs.org/api/ng/service/$compile#life-cycle-hooks

    angular.module('do-check-module', [])
    .component('app', {
      template:
        'Month: <input ng-model="$ctrl.month" ng-change="$ctrl.updateDate()">' +
        'Date: {{ $ctrl.date }}' +
        '<test date="$ctrl.date"></test>',
      controller: function() {
        this.date = new Date();
        this.month = this.date.getMonth();
        this.updateDate = function() {
          this.date.setMonth(this.month);
        };
      }
    })
    .component('test', {
      bindings: { date: '<' },
      template:
        '<pre>{{ $ctrl.log | json }}</pre>',
      controller: function() {
        var previousValue;
        this.log = [];
        //hook here
        this.$doCheck = function() {
          var currentValue = this.date && this.date.valueOf();
          if (previousValue !== currentValue) {
            this.log.push('doCheck: date mutated: ' + this.date);
            previousValue = currentValue;
          }
        };
      }
    });
    

    参考:
    https://ui-router.github.io/docs/latest/modules/ng1_state_events.html
    https://github.com/angular-ui/ui-router/wiki#state-change-events
    http://www.brafox.com/post/2015/javascript/angularjs/angularjs-router-interceptor.html

  • 相关阅读:
    asp.net2.0系列视频教程
    Android入门教程(三十一)SQLite分页读取(转)
    sql语句大全
    判断是不是ie浏览器 加上ie11
    字节面试题
    泛型
    线程和
    sysbench工具
    自定义集合类
    类型通配符
  • 原文地址:https://www.cnblogs.com/wancy86/p/check_login.html
Copyright © 2020-2023  润新知