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 相关文章推荐
解密效果
Jun 23 Javascript
javascript中substr,substring,slice.splice的区别说明
Nov 25 Javascript
IE6中链接A的href为javascript协议时不在当前页面跳转
Jun 05 Javascript
JavaScript中的console.profile()函数详细介绍
Dec 29 Javascript
javascript操作ul中li的方法
May 14 Javascript
javascript中递归函数用法注意点
Jul 30 Javascript
微信小程序 在线支付功能的实现
Mar 14 Javascript
详解react-router 4.0 下服务器如何配合BrowserRouter
Dec 29 Javascript
Vue单页及多页应用全局配置404页面实践记录
May 22 Javascript
vue3实现v-model原理详解
Oct 09 Javascript
Vue图片浏览组件v-viewer用法分析【支持旋转、缩放、翻转等操作】
Nov 04 Javascript
利用node.js开发cli的完整步骤
Dec 29 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 set_error_handler()函数使用详解(示例)
2013/11/12 PHP
分享一个超好用的php header下载函数
2014/01/31 PHP
PHP连接sql server 2005环境配置及问题解决
2014/08/08 PHP
yii2实现分页,带搜索的分页功能示例
2017/01/07 PHP
HTML TO JavaScript 转换
2006/06/26 Javascript
jQuery 中关于CSS操作部分使用说明
2007/06/10 Javascript
js 居中漂浮广告
2010/03/21 Javascript
精心挑选的15个jQuery下拉菜单制作教程
2012/06/15 Javascript
ExtJS4 Grid改变单元格背景颜色及Column render学习
2013/02/06 Javascript
jquery和javascript的区别(常用方法比较)
2013/07/04 Javascript
实现动画效果核心方式的js代码
2013/09/27 Javascript
js获取视频时长代码
2014/04/10 Javascript
从零学JSON之JSON数据结构
2014/05/19 Javascript
使用javascript实现json数据以csv格式下载
2015/01/09 Javascript
JavaScript 定时器 SetTimeout之定时刷新窗口和关闭窗口(代码超简单)
2016/02/26 Javascript
分析JavaScript数组操作难点
2017/12/18 Javascript
vue的style绑定background-image的方式和其他变量数据的区别详解
2018/09/03 Javascript
Vue中图片Src使用变量的方法
2019/10/30 Javascript
Vue实现小购物车功能
2020/12/21 Vue.js
[48:21]Mski vs VGJ.S Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
为何人工智能(AI)首选Python?读完这篇文章你就知道了(推荐)
2019/04/06 Python
python实现基于朴素贝叶斯的垃圾分类算法
2019/07/09 Python
python实现快递价格查询系统
2020/03/03 Python
高清屏中使用Canvas绘图出现模糊的问题及解决方法
2019/06/03 HTML / CSS
雅诗兰黛美国官网:Estee Lauder美国
2016/07/21 全球购物
雅高酒店中国:Accorhotels.com China
2018/03/26 全球购物
意大利网上购书网站:Libraccio.it
2021/02/03 全球购物
EJB包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的
2015/07/24 面试题
运动会入场解说词300字
2014/01/25 职场文书
商场消防安全责任书
2014/07/29 职场文书
街道务虚会发言材料
2014/10/20 职场文书
Python类方法总结讲解
2021/07/26 Python
Python实现照片卡通化
2021/12/06 Python
Python内置的数据类型及使用方法
2022/04/13 Python
图神经网络GNN算法
2022/05/11 Python
面试官问我Mysql的存储引擎了解多少
2022/08/05 MySQL