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 相关文章推荐
用javascript父窗口控制只弹出一个子窗口
Apr 10 Javascript
jQuery为iframe的body添加click事件的实现代码
Apr 07 Javascript
node.js 使用ejs模板引擎时后缀换成.html
Apr 22 Javascript
使用requestAnimationFrame实现js动画性能好
Aug 06 Javascript
基于jQuery实现美观且实用的倒计时实例代码
Dec 30 Javascript
AngularJS 面试题集锦
Sep 06 Javascript
使用JS读取XML文件的方法
Nov 25 Javascript
JS SetInterval 代码实现页面轮询
Aug 11 Javascript
jQuery选择器之子元素过滤选择器
Sep 28 jQuery
解决bootstrap中下拉菜单点击后不关闭的问题
Aug 10 Javascript
koa socket即时通讯的示例代码
Sep 07 Javascript
谈谈JavaScript中super(props)的重要性
Feb 12 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 GD库生成图像的几个函数总结
2014/11/19 PHP
php恢复数组的key为数字序列的方法
2015/04/28 PHP
实例详解PHP中html word 互转的方法
2016/01/28 PHP
常用PHP数组排序函数归纳
2016/08/08 PHP
php常用字符串String函数实例总结【转换,替换,计算,截取,加密】
2016/12/07 PHP
thinkPHP数据查询常用方法总结【select,find,getField,query】
2017/03/15 PHP
php中请求url的五种方法总结
2017/07/13 PHP
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
2017/09/20 PHP
Js 订制自己的AlertBox(信息提示框)
2009/01/09 Javascript
javascript小数计算出现近似值的解决办法
2010/02/06 Javascript
禁止js文件缓存的代码
2010/04/09 Javascript
图片轮换效果实现代码(点击按钮停止执行)
2013/04/12 Javascript
jquery 多行文本框(textarea)高度变化
2013/07/03 Javascript
浅谈Unicode与JavaScript的发展史
2015/01/19 Javascript
js获取当前日期前七天的方法
2015/02/28 Javascript
JavaScript实现将文本框的值插入指定位置的方法
2015/08/13 Javascript
JS和JQuery实现雪花飘落效果
2017/11/30 jQuery
webpack项目使用eslint建立代码规范实现
2019/05/16 Javascript
JS跨浏览器解析XML应用过程详解
2020/10/16 Javascript
[01:16:13]DOTA2-DPC中国联赛 正赛 SAG vs Dragon BO3 第一场 2月22日
2021/03/11 DOTA
跟老齐学Python之关于循环的小伎俩
2014/10/02 Python
Python爬取Coursera课程资源的详细过程
2014/11/04 Python
python 列表删除所有指定元素的方法
2018/04/19 Python
python求最大值最小值方法总结
2019/06/25 Python
新手如何发布Python项目开源包过程详解
2019/07/11 Python
python 实现 hive中类似 lateral view explode的功能示例
2020/05/18 Python
让Django的BooleanField支持字符串形式的输入方式
2020/05/20 Python
马来西亚网上花店:FlowerAdvisor马来西亚
2020/01/03 全球购物
写一个函数返回1+2+3+…+n的值(假定结果不会超过长整型变量的范围)
2014/09/05 面试题
JSP&Servlet技术面试题
2015/05/21 面试题
夜大毕业生自我评价分享
2013/11/10 职场文书
静心口服夜广告词
2014/03/20 职场文书
公司任命书范本
2014/06/04 职场文书
校园文明标语
2014/06/13 职场文书
数学教研活动总结
2014/07/02 职场文书
Opencv实现二维直方图的计算及绘制
2021/07/21 Python