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 相关文章推荐
FF IE兼容性的修改小结
Sep 02 Javascript
javascript自执行函数之伪命名空间封装法
Dec 25 Javascript
jquery动态加载图片数据练习代码
Aug 04 Javascript
在每个匹配元素的外部插入新元素的方法
Dec 20 Javascript
input点击后placeholder中的提示消息消失
Jan 15 Javascript
jquery获取复选框的值的简单实例
May 26 Javascript
js实现多行文本框统计剩余字数功能
Mar 28 Javascript
详解Vue用自定义指令完成一个下拉菜单(select组件)
Oct 31 Javascript
JavaScript满天星导航栏实现方法
Mar 08 Javascript
在微信小程序中保存网络图片
Feb 12 Javascript
Vue-CLI 3.X 部署项目至生产服务器的方法
Mar 22 Javascript
微信小程序 高德地图路线规划实现过程详解
Aug 05 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编程实现获取excel文档内容的代码实例
2011/06/28 PHP
php递归函数中使用return的注意事项
2014/01/17 PHP
win平台安装配置Nginx+php+mysql 环境
2016/01/12 PHP
php pdo操作数据库示例
2017/03/10 PHP
JavaScript中void(0)的具体含义解释
2007/02/27 Javascript
表单(FORM)的一些实用效果代码
2007/03/25 Javascript
window.onresize 多次触发的解决方法
2013/11/08 Javascript
JavaScript中的迭代器和生成器详解
2014/10/29 Javascript
不使用ajax实现无刷新提交表单
2014/12/21 Javascript
js日期范围初始化得到前一个月日期的方法
2015/05/05 Javascript
JavaScript高级程序设计(第三版)学习笔记1~5章
2016/03/11 Javascript
node.js cookie-parser之parser.js
2016/06/06 Javascript
JS实现简单抖动效果
2017/06/01 Javascript
MUI顶部选项卡的用法(tab-top-webview-main)详解
2017/10/08 Javascript
vue-video-player实现实时视频播放方式(监控设备-rtmp流)
2020/08/10 Javascript
vue使用exif获取图片经纬度的示例代码
2020/12/11 Vue.js
[00:20]DOTA2荣耀之路7:-ah fu-抢盾
2018/05/31 DOTA
Python操作json数据的一个简单例子
2014/04/17 Python
python 打印出所有的对象/模块的属性(实例代码)
2016/09/11 Python
python利用标准库如何获取本地IP示例详解
2017/11/01 Python
python 常用的基础函数
2018/07/10 Python
详解Python进阶之切片的误区与高级用法
2018/12/24 Python
浅谈Python type的使用
2019/11/19 Python
Flask项目中实现短信验证码和邮箱验证码功能
2019/12/05 Python
在Python3.74+PyCharm2020.1 x64中安装使用Kivy的详细教程
2020/08/07 Python
函授大专自我鉴定
2013/11/01 职场文书
小区停车场管理制度
2014/01/27 职场文书
买房协议书
2014/04/11 职场文书
关于读书的演讲稿
2014/05/07 职场文书
电子信息工程专业求职信
2014/06/28 职场文书
领导班子奢靡之风查摆问题及整改措施
2014/09/27 职场文书
学习经验交流会演讲稿
2015/11/02 职场文书
分享几个JavaScript运算符的使用技巧
2021/04/24 Javascript
javascript数组includes、reduce的基本使用
2021/07/02 Javascript
Spring Security中用JWT退出登录时遇到的坑
2021/10/16 Java/Android
利用 JavaScript 构建命令行应用
2021/11/17 Javascript