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 Undefined,Null类型和NaN值区别
Oct 22 Javascript
JavaScript中的关键字"VAR"使用详解 分享
Jul 31 Javascript
node.js中的querystring.unescape方法使用说明
Dec 10 Javascript
使用Chrome浏览器调试AngularJS应用的方法
Jun 18 Javascript
深入分析JSON编码格式提交表单数据
Jun 25 Javascript
iframe中使用jquery进行查找的方法【案例分析】
Jun 17 Javascript
利用Plupload.js解决大文件上传问题, 带进度条和背景遮罩层
Mar 15 Javascript
javascript实现动态显示颜色块的报表效果
Apr 10 Javascript
antd组件Upload实现自己上传的实现示例
Dec 18 Javascript
微信小程序时间选择插件使用详解
Dec 28 Javascript
JavaScript中常用的简洁高级技巧总结
Mar 10 Javascript
Vue 中使用富文本编译器wangEditor3的方法
Sep 26 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
如何分别全角和半角以避免乱码
2006/10/09 PHP
PHP使用两个栈实现队列功能的方法
2018/01/15 PHP
javascript实现的鼠标链接提示效果生成器代码
2007/06/28 Javascript
javascript document.referrer 用法
2009/04/30 Javascript
用js+iframe形成页面的一种遮罩效果的具体实现
2013/12/31 Javascript
jQuery插件zoom实现图片全屏放大弹出层特效
2015/04/15 Javascript
HTML5实现留言和回复页面样式
2015/07/22 Javascript
浅析javascript的return语句
2015/12/15 Javascript
基于bootstrap插件实现autocomplete自动完成表单
2016/05/07 Javascript
js判断iframe中元素是否存在的实现代码
2016/12/24 Javascript
jquery 判断是否支持Placeholder属性的方法
2017/02/07 Javascript
vue2利用Bus.js如何实现非父子组件通信详解
2017/08/25 Javascript
react-native-tab-navigator组件的基本使用示例代码
2017/09/07 Javascript
js实现会跳动的日历效果(完整实例)
2017/10/18 Javascript
CKEditor4配置与开发详细中文说明文档
2018/10/08 Javascript
layer弹出框确定前验证:弹出消息框的方法(弹出两个layer)
2019/09/21 Javascript
Vue.js计算机属性computed和methods方法详解
2019/10/12 Javascript
在vue中利用v-html按分号将文本换行的例子
2019/11/14 Javascript
JS中间件设计模式的深入探讨与实例分析
2020/04/11 Javascript
文章或博客自动生成章节目录索引(支持三级)的实现代码
2020/05/10 Javascript
python中的yield使用方法
2014/02/11 Python
微信跳一跳python代码实现
2018/01/05 Python
Python cookbook(数据结构与算法)实现查找两个字典相同点的方法
2018/02/18 Python
python中利用zfill方法自动给数字前面补0
2018/04/10 Python
pycharm远程开发项目的实现步骤
2019/01/20 Python
雅萌 (YA-MAN) :日本美容家电领域的龙头企业
2017/05/12 全球购物
台湾旅游网站:灿星旅游
2018/10/11 全球购物
Brasty波兰:香水、化妆品、手表网上商店
2019/04/15 全球购物
前处理班长职位说明书
2014/03/01 职场文书
小学生一分钟演讲稿
2014/08/26 职场文书
2015年乡镇信访工作总结
2015/04/07 职场文书
餐饮店长岗位职责
2015/04/14 职场文书
重温经典:乔布斯在斯坦福大学的毕业演讲(双语)
2019/08/26 职场文书
新手,如何业余时间安排好写作、提高写作能力?
2019/10/21 职场文书
Python爬取英雄联盟MSI直播间弹幕并生成词云图
2021/06/01 Python
Python答题卡识别并给出分数的实现代码
2021/06/22 Python