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 学习之二 属性(html()与html(val))
Nov 25 Javascript
使用javascript:将其它类型值转换成布尔类型值的解决方法详解
May 07 Javascript
一个JavaScript用逗号分割字符串实例
Sep 22 Javascript
Jquery UI实现一次拖拽多个选中的元素操作
Dec 01 Javascript
基于JavaScript实现全选、不选和反选效果
Feb 15 Javascript
socket.io学习教程之基础介绍(一)
Apr 29 Javascript
Bootstrap 表单验证formValidation 实现表单动态验证功能
May 17 Javascript
微信小程序开发之map地图实现教程
Jun 08 Javascript
利用node.js实现反向代理的方法详解
Jul 24 Javascript
关于Vue实现组件信息的缓存问题
Aug 23 Javascript
React事件处理的机制及原理
Dec 03 Javascript
vue简单练习 桌面时钟的实现代码实例
Sep 19 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语法(3)
2006/10/09 PHP
利用curl抓取远程页面内容的示例代码
2013/07/23 PHP
PHP魔术方法以及关于独立实例与相连实例的全面讲解
2016/10/18 PHP
PDO::errorCode讲解
2019/01/28 PHP
laradock环境docker-compose操作详解
2019/07/29 PHP
网上应用的一个不错common.js脚本
2007/08/08 Javascript
用JQuery 实现AJAX加载XML并解析的脚本
2009/07/25 Javascript
解析ScrollPic在ie8下只滚动一遍,然后变为空白 ie6,ie7,chrome,firefox正常
2013/06/26 Javascript
深入理解javascript动态插入技术
2013/11/12 Javascript
基于jQuery实现的美观星级评论打分组件代码
2015/10/30 Javascript
jQuery判断浏览器并动态调整select宽度的方法
2016/03/02 Javascript
jquery获取复选框的值的简单实例
2016/05/26 Javascript
巧用数组制作图片切换js代码
2016/11/29 Javascript
ComboBox(下拉列表框)通过url加载调用远程数据的方法
2017/08/06 Javascript
JS 仿支付宝input文本输入框放大组件的实例
2017/11/14 Javascript
Javascript将图片的绝对路径转换为base64编码的方法
2018/01/11 Javascript
SVG实现时钟效果
2018/07/17 Javascript
Vue创建头部组件示例代码详解
2018/10/23 Javascript
小程序识别身份证,银行卡,营业执照,驾照的实现
2019/11/05 Javascript
Python 使用os.remove删除文件夹时报错的解决方法
2017/01/13 Python
python简单实例训练(21~30)
2017/11/15 Python
python3调用R的示例代码
2018/02/23 Python
python使用tornado实现简单爬虫
2018/07/28 Python
教你如何编写、保存与运行Python程序的方法
2019/07/12 Python
Python实现微信好友的数据分析
2019/12/16 Python
PyQt5.6+pycharm配置以及pyinstaller生成exe(小白教程)
2020/06/02 Python
浅谈tensorflow使用张量时的一些注意点tf.concat,tf.reshape,tf.stack
2020/06/23 Python
Python从文件中读取数据的方法步骤
2020/11/18 Python
手对手的教你用canvas画一个简单的海报的方法示例
2018/12/10 HTML / CSS
英语自荐信范文
2013/12/11 职场文书
大三毕业自我鉴定
2014/01/15 职场文书
经典促销广告词大全
2014/03/19 职场文书
环保建议书200字
2014/05/14 职场文书
乡镇干部个人整改措施思想汇报
2014/10/10 职场文书
2015年元宵节活动总结
2015/02/06 职场文书
董事长秘书工作总结
2015/08/14 职场文书