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 相关文章推荐
用js实现的页面关键字密度查询代码
Dec 27 Javascript
jquery实现tr元素的上下移动示例代码
Dec 20 Javascript
js toFixed()方法的重写实现精度的统一
Mar 06 Javascript
两种不同的方法实现js对checkbox进行全选和反选
May 13 Javascript
浅谈$(document)和$(window)的区别
Jul 15 Javascript
JavaScript简单判断复选框是否选中及取出值的方法
Aug 13 Javascript
javascript 定时器工作原理分析
Dec 03 Javascript
vue中如何引入jQuery和Bootstrap
Apr 10 jQuery
vue实现动态数据绑定
Apr 28 Javascript
node app 打包工具pkg的具体使用
Jan 17 Javascript
vue配置nprogress实现页面顶部进度条
Sep 21 Javascript
JavaScript this在函数中的指向及实例详解
Oct 14 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中error_reporting()函数的用法(修改PHP屏蔽错误)
2011/07/01 PHP
兼容firefox,chrome的网页灰度效果
2011/08/08 PHP
dedecms函数分享之获取某一栏目所有子栏目
2014/05/19 PHP
PHP的Json中文处理解决方案
2016/09/29 PHP
用函数式编程技术编写优美的 JavaScript_ibm
2008/05/16 Javascript
基于jQuery的图片大小自动适应实现代码
2010/11/17 Javascript
JS截取url中问号后面参数的值信息
2014/04/29 Javascript
Javascript模仿淘宝信用评价实例(附源码)
2015/11/26 Javascript
Jqgrid之强大的表格插件应用
2015/12/02 Javascript
javascript解决小数的加减乘除精度丢失的方案
2016/05/31 Javascript
Angular 理解module和injector,即依赖注入
2016/09/07 Javascript
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
2016/12/14 Javascript
微信小程序开发经验总结(推荐)
2017/01/11 Javascript
浅析jsopn跨域请求原理及cors(跨域资源共享)的完美解决方法
2017/02/06 Javascript
使用webpack编译es6代码的方法步骤
2019/04/28 Javascript
bootstrap实现嵌套模态框的实例代码
2020/01/10 Javascript
python网络编程学习笔记(四):域名系统
2014/06/09 Python
带你了解python装饰器
2017/06/15 Python
简单了解python数组的基本操作
2019/11/26 Python
pytorch GAN生成对抗网络实例
2020/01/10 Python
分布式全文检索引擎ElasticSearch原理及使用实例
2020/11/14 Python
调用HTML5的Canvas API绘制图形的快速入门指南
2016/06/17 HTML / CSS
全球性的在线购物网站:Zapals
2017/03/22 全球购物
Booking.com美国:全球酒店预订网站
2017/04/18 全球购物
澳大利亚家庭花园和DIY工具网店:VidaXL
2019/05/03 全球购物
Order by的几种用法
2013/06/16 面试题
培训自我鉴定
2014/01/31 职场文书
八项规定整改措施
2014/02/12 职场文书
设计专业毕业生求职信
2014/06/25 职场文书
离婚财产处理协议书
2014/09/30 职场文书
小学教师个人总结
2015/02/05 职场文书
2015学校师德师风工作总结
2015/04/22 职场文书
公司员工辞职信范文
2015/05/12 职场文书
史上最全书信经典范文大全(建议收藏)
2019/07/10 职场文书
sql通过日期判断年龄函数的示例代码
2021/07/16 SQL Server
Win11 vmware不兼容怎么办?Win11与VMware虚拟机不兼容的解决方法
2023/01/09 数码科技