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常用对象的方法和属性小结
Jan 24 Javascript
Tab切换组件(选项卡功能)实例代码
Nov 21 Javascript
javascript Event对象详解及使用示例
Nov 22 Javascript
浅析JavaScript中的同名标识符优先级
Dec 06 Javascript
jquery实现图片预加载
Dec 25 Javascript
Node.js + Redis Sorted Set实现任务队列
Sep 19 Javascript
利用Vue.js实现checkbox的全选反选效果
Jan 18 Javascript
JavaScript用二分法查找数据的实例代码
Jun 17 Javascript
vue计算属性时v-for处理数组时遇到的一个bug问题
Jan 21 Javascript
JS对象和字符串之间互换操作实例分析
Feb 02 Javascript
JavaScript实现手机号码 3-4-4格式并控制新增和删除时光标的位置
Jun 02 Javascript
ztree+ajax实现文件树下载功能
May 18 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+iFrame实现页面无需刷新的异步文件上传
2014/09/16 PHP
php的crc32函数使用时需要注意的问题(不然就是坑)
2015/04/21 PHP
PHP异常处理定义与使用方法分析
2017/07/25 PHP
thinkphp5.1框架中容器(Container)和门面(Facade)的实现方法分析
2019/08/05 PHP
PHP实现数组根据某个字段进行水平合并,横向合并案例分析
2019/10/08 PHP
JQery jstree 大数据量问题解决方法
2010/03/09 Javascript
jquery实现的缩略图预览滑块实例
2015/06/25 Javascript
基于jquery实现的树形菜单效果代码
2015/09/06 Javascript
两种方法解决javascript url post 特殊字符转义 + & #
2016/04/13 Javascript
jQuery实现微信长按识别二维码功能
2016/08/26 Javascript
JS去除重复并统计数量的实现方法
2016/12/15 Javascript
Angular模板表单校验方法详解
2017/08/11 Javascript
js禁止浏览器页面后退功能的实例(推荐)
2017/09/01 Javascript
Nodejs连接mysql并实现增、删、改、查操作的方法详解
2018/01/04 NodeJs
jQuery实现新闻播报滚动及淡入淡出效果示例
2018/03/23 jQuery
React Native日期时间选择组件的示例代码
2018/04/27 Javascript
自定义vue组件发布到npm的方法
2018/05/09 Javascript
在vue项目中优雅的使用SVG的方法实例详解
2018/12/03 Javascript
[55:16]Mski vs VGJ.S Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
[00:17]天涯墨客一技能展示
2018/08/25 DOTA
Djang中静态文件配置方法
2015/07/30 Python
Python多层装饰器用法实例分析
2018/02/09 Python
django反向解析URL和URL命名空间的方法
2018/06/05 Python
python飞机大战 pygame游戏创建快速入门详解
2019/12/17 Python
python中with语句结合上下文管理器操作详解
2019/12/19 Python
使用PyOpenGL绘制三维坐标系实例
2019/12/24 Python
浅谈python print(xx, flush = True) 全网最清晰的解释
2020/02/21 Python
django使用JWT保存用户登录信息
2020/04/22 Python
PyQt5连接MySQL及QMYSQL driver not loaded错误解决
2020/04/29 Python
CSS3 Flexbox中flex-shrink属性的用法示例介绍
2013/12/30 HTML / CSS
美国五金商店:Ace Hardware
2018/03/27 全球购物
公司租房协议书范本
2014/10/08 职场文书
新生儿未入户证明
2015/06/23 职场文书
开学第一天的感想
2015/08/10 职场文书
小学主题班会教案
2015/08/17 职场文书
Mysql中where与on的区别及何时使用详析
2021/08/04 MySQL