AngularJS实现用户登录状态判断的方法(Model添加拦截过滤器,路由增加限制)


Posted in Javascript onDecember 12, 2016

本文实例讲述了AngularJS实现用户登录状态判断的方法。分享给大家供大家参考,具体如下:

使用AngularJS的单页面应用时,由于是本地路由在控制页面跳转,但是有的时候我们需要判断用户是否登录来判断用户是否能进入界面。

angularjs是mvc架构所以实现起来很容易也很灵活,我们只MainController里增加一个路由事件侦听并判断,这样就可以避免未登录用户直接输入路由地址来跳转到登录界面地址了

代码中的 $rootScope.user是登录后把用户信息放到了全局rootScope上,方便其他地方使用,$rootScope.defaultPage也是默认主页面,初始化的时候写死到rootScope里的。

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

另外还有用户已经登录,但是登录超时了,还有就是增加后台接口的判断来增强安全性。不能完全依靠本地逻辑

我们在model里面增加一个用户拦截器,在rensponseError中判断错误码,抛出事件让Contoller或view来处理

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);
    }
  };
}]);

别忘了要注册拦截器到angularjs的config中哦

app.config(function ($httpProvider) {
  $httpProvider.interceptors.push('UserInterceptor');
});

最后在controller中处理错误事件

$rootScope.$on('userIntercepted',function(errorType){
  // 跳转到登录界面,这里我记录了一个from,这样可以在登录后自动跳转到未登录之前的那个界面
  $state.go("login",{from:$state.current.name,w:errorType});
});

最后还可以在loginController中做更多的细节处理

// 如果用户已经登录了,则立即跳转到一个默认主页上去,无需再登录
if($rootScope.user.token){
  $state.go($rootScope.defaultPage);
  return;
}

另外在登录成功回调后还可以跳转到上一次界面,也就是上面记录的from

var from = $stateParams["from"];
$state.go(from && from != "login" ? from : $rootScope.defaultPage);

希望本文所述对大家AngularJS程序设计有所帮助。

Javascript 相关文章推荐
jquery 1.3.2 IE8中的一点点的小问题解决方法
Jul 10 Javascript
javascript attachEvent绑定多个事件执行顺序问题
Oct 20 Javascript
JS动态调用方法名示例介绍
Dec 18 Javascript
jQuery中slideUp 和 slideDown 的点击事件
Feb 26 Javascript
Vue.js快速入门实例教程
Oct 15 Javascript
js实现炫酷的左右轮播图
Jan 18 Javascript
理解javascript中的Function.prototype.bind的方法
Feb 03 Javascript
javascript基础知识之html5轮播图实例讲解(44)
Feb 17 Javascript
详解Vue 实例中的生命周期钩子
Mar 21 Javascript
angularjs 获取默认选中的单选按钮的value方法
Feb 28 Javascript
jQuery中元素选择器(element)简单用法示例
May 14 jQuery
nuxt.js中间件实现拦截权限判断的方法
Nov 21 Javascript
jquery实现瀑布流效果 jquery下拉加载新数据
Dec 12 #Javascript
AngularJS封装指令方法详解
Dec 12 #Javascript
JS+Canvas实现的俄罗斯方块游戏完整实例
Dec 12 #Javascript
最好用的Bootstrap fileinput.js文件上传组件
Dec 12 #Javascript
jQuery Ajax File Upload实例源码
Dec 12 #Javascript
VueJs与ReactJS和AngularJS的异同点
Dec 12 #Javascript
layer实现弹窗提交信息
Dec 12 #Javascript
You might like
PHP中动态显示签名和ip原理
2007/03/28 PHP
浅谈php serialize()与unserialize()的用法
2013/06/05 PHP
PHP计算一年多少个星期和每周的开始和结束日期
2014/07/01 PHP
destoon实现调用图文新闻的方法
2014/08/21 PHP
PHP实现通过文本文件统计页面访问量功能示例
2019/02/13 PHP
jquery 表单进行客户端验证demo
2009/08/24 Javascript
jQuery中对未来的元素绑定事件用bind、live or on
2014/04/17 Javascript
一个js过滤空格的小函数
2014/10/10 Javascript
不同js异步函数同步的实现方法
2016/05/28 Javascript
js中window.open的参数及注意注意事项
2016/07/06 Javascript
Angular表单验证实例详解
2016/10/20 Javascript
浅谈JS验证表单文本域输入空格的问题
2017/02/14 Javascript
JS实现DIV高度自适应窗口示例
2017/02/16 Javascript
通过npm引用的vue组件使用详解
2017/03/02 Javascript
jQuery插件FusionCharts实现的3D帕累托图效果示例【附demo源码】
2017/03/25 jQuery
Vue2.0仿饿了么webapp单页面应用详细步骤
2018/07/08 Javascript
详解微信小程序开发用户授权登陆
2019/04/24 Javascript
深入了解js原型模式
2019/05/30 Javascript
js实现数字跳动到指定数字
2020/08/25 Javascript
js实现购物车商品数量加减
2020/09/21 Javascript
Python 爬虫图片简单实现
2017/06/01 Python
python 重定向获取真实url的方法
2018/05/11 Python
Django应用程序入口WSGIHandler源码解析
2019/08/05 Python
详解python 降级到3.6终极解决方案
2020/02/06 Python
django 实现简单的插入视频
2020/04/07 Python
15个Pythonic的代码示例(值得收藏)
2020/10/29 Python
自荐信格式的六要素
2013/09/21 职场文书
三年大学生活自我鉴定
2014/01/21 职场文书
授权委托书怎么写
2014/04/03 职场文书
篮球比赛口号
2014/06/10 职场文书
篮球社团活动总结
2014/06/27 职场文书
2016民族团结先进个人事迹材料
2016/02/26 职场文书
职工趣味运动会开幕词
2016/03/04 职场文书
职场中的你,辞职信写对了吗?
2019/06/26 职场文书
基于Redis过期事件实现订单超时取消
2021/05/08 Redis
python通过新建环境安装tfx的问题
2022/05/20 Python