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使用办法
Apr 01 Javascript
JavaScript网页定位详解
Jan 13 Javascript
png在IE6 下无法透明的解决方法汇总
May 21 Javascript
Javascript中String的常用方法实例分析
Jun 13 Javascript
图解Sublime Text3使用技巧
Dec 21 Javascript
深入浅析JavaScript中的3DES
Aug 24 Javascript
AngularJS实现星星等级评分功能
Sep 24 Javascript
微信小程序中input标签详解及简单实例
May 18 Javascript
JS滚轮控制图片缩放大小和拖动的实例代码
Nov 20 Javascript
微信小程序swiper禁止用户手动滑动代码实例
Aug 23 Javascript
Vue数字输入框组件的使用方法
Oct 19 Javascript
JS简易计算器实例讲解
Jun 30 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
Codeigniter整合Tank Auth权限类库详解
2014/06/12 PHP
PHP IDE PHPStorm配置支持友好Laravel代码提示方法
2015/05/12 PHP
关于JavaScript的一些看法
2009/05/27 Javascript
Javascript 检测、添加、移除样式(className)函数代码
2009/09/08 Javascript
jQuery 在光标定位的地方插入文字的插件
2012/05/10 Javascript
jquery无法设置checkbox选中即没有变成选中状态
2014/03/27 Javascript
Javascript中封装window.open解决不兼容问题
2014/09/28 Javascript
jQuery拖拽插件gridster使用指南
2015/04/21 Javascript
使用jquery实现鼠标滑过弹出更多相关信息层附源码下载
2015/11/23 Javascript
JS闭包、作用域链、垃圾回收、内存泄露相关知识小结
2016/05/16 Javascript
Angular 常用指令实例总结整理
2016/12/13 Javascript
ionic2打包android时gradle无法下载的解决方法
2017/04/05 Javascript
Angular2.0实现modal对话框的方法示例
2018/02/18 Javascript
Vue中"This dependency was not found"问题的解决方法
2018/06/19 Javascript
vue.js项目 el-input 组件 监听回车键实现搜索功能示例
2018/08/25 Javascript
vue+高德地图写地图选址组件的方法
2019/05/18 Javascript
npm ci命令的基本使用方法
2020/09/20 Javascript
深入理解Python中的内置常量
2017/05/20 Python
TF-IDF与余弦相似性的应用(二) 找出相似文章
2017/12/21 Python
为什么选择python编程语言入门黑客攻防 给你几个理由!
2018/02/02 Python
python操作小程序云数据库实现简单的增删改查功能
2019/06/06 Python
Django项目后台不挂断运行的方法
2019/08/31 Python
使用NumPy读取MNIST数据的实现代码示例
2019/11/20 Python
浅谈Python中的模块
2020/06/10 Python
Python3爬虫带上cookie的实例代码
2020/07/28 Python
10行Python代码实现Web自动化管控的示例代码
2020/08/14 Python
python3实现名片管理系统(控制台版)
2020/11/29 Python
查找适用于matplotlib的中文字体名称与实际文件名对应关系的方法
2021/01/05 Python
美国独家设计师眼镜在线光学商店:Glasses Gallery
2017/12/28 全球购物
上海中网科技笔试题
2012/02/19 面试题
幼儿园秋游活动方案
2014/01/21 职场文书
《老山界》教学反思
2014/04/08 职场文书
无毒社区工作方案
2014/05/23 职场文书
2014年居委会工作总结
2014/12/09 职场文书
作文评语怎么写
2014/12/25 职场文书
上下班时间调整通知
2015/04/23 职场文书