当jquery ajax遇上401请求的解决方法


Posted in Javascript onMay 19, 2016

jquery ajax是个很常用接口,而在请求时候,可能存在响应401的情况(身份认证过期或未登录),比较容易出现在混合应用上,如何进行身份认证,重发失败请求,还是值得注意的。

ajax请求有两种方式

1. 回调

最常写的方式,成功失败处理以回调方式传入。

$.ajax({
   ajax参数...
   success : xxxxxx
   error: xxxxxx
});

2. Deferred方式

Deferred模式我在《js异步编程》有说明, ajax调用本身返回就是一个Deferred对象,成功失败回调不以参数传入。

$.ajax({
   ajax参数...
}).then(function(res){
  //成功处理片段
},function(err){
  //失败处理片段
});

既然有这两种方式,那应对处理401的方式也是有两种。

401处理的两种方式

1. 回调

这种方式的处理比较简单,在失败回调里面判断401,如果是则进行身份认证,成功重发请求。

function getXXXX(type, url, data, success, error){
$.ajax({
  
ajax参数...
  
 success : xxxxxx
  
 error : function(xhr,textStatus,errorThrown){
    
if (xhr.status == 401) {
    

 刷新身份认证方法(function(){
       
getXXXX(type, url, data, success, error);
      
});
      } else{
      
// 调用外部的error
        error && error(xhr,textStatus,errorThrown);
   
 }
  
}

});
}

2. Deferred方式

这种方式目前我找到的处理方式需要修改jquery源码。

//全局设置一个方法
$.ajaxSetup({
   authError : function(callback){
      刷新身份认证方法( function(){
        callback && callback();
      });
   }
});
 
//jquery2.1.4版本源码,大概是8261行
// Success/Error
if ( isSuccess ) {
   deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
} else {
   if(( jqXHR.status == 401 || jqXHR .status == 403) && callbackContext.authError){
   callbackContext.authError(function (){
      state = 0;
      jqXHR.setRequestHeader( "Authorization", XXXXXX);
      jqXHR.readyState = 1;
      try {
        state = 1;
        transport.send( requestHeaders, done );
      } catch ( e ) {
        // Propagate exception as error if not done
        if ( state < 2 ) {
           done( -1, e );
        // Simply rethrow otherwise
        } else {
          throw e;
        }
      }
   
});
   
return;
   } else {
      deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
   }
}

这里说下为什么不能像第一种方式那样进行请求。

有两个原因:

1. then这种链式写法,导致这请求的回调不是在参数里,而是在jQuery.Callbacks一个optionsCache全局变量里,我们无法在ajax error里拿到回调函数进行重发。

2. 写在then里的回调触发一次就会被销毁,当触发了error时,回调执行后就销毁。

最后的处理方式就是在要触发error之前,拦截401的错误,重新进行身份认证,然后重置状态,重发请求。

以上这篇当jquery ajax遇上401请求的解决方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery获取对象的方法足以应付常见的各种类型的对象
May 14 Javascript
js利用prototype调用Array的slice方法示例
Jun 09 Javascript
JavaScript实现的字符串replaceAll函数代码分享
Apr 02 Javascript
jQuery 获取跨域XML(RSS)数据的相关总结分析
May 18 Javascript
JavaScript判断浏览器及其版本信息
Jan 20 Javascript
jQuery实现选项卡功能(两种方法)
Mar 08 Javascript
JS监控关闭浏览器操作的实例详解
Sep 12 Javascript
为输入框加入数字js校验代码分享
Nov 02 Javascript
JS用最简单的方法实现四舍五入
Aug 27 Javascript
vue源码中的检测方法的实现
Sep 26 Javascript
vuex 实现getter值赋值给vue组件里的data示例
Nov 05 Javascript
node.js中stream流中可读流和可写流的实现与使用方法实例分析
Feb 13 Javascript
基于Echarts 3.19 制作常用的图形(非静态)
May 19 #Javascript
前端js文件合并的三种方式推荐
May 19 #Javascript
Node.js+Express配置入门教程
May 19 #Javascript
JavaScript中解决多浏览器兼容性23个问题的快速解决方法
May 19 #Javascript
判断数组是否包含某个元素的js函数实现方法
May 19 #Javascript
JQuery 在文档中查找指定name的元素并移除的实现方法
May 19 #Javascript
去除html代码里面的script正则方法
May 19 #Javascript
You might like
我的论坛源代码(四)
2006/10/09 PHP
PHP的单引号和双引号 字符串效率
2009/05/27 PHP
用PHP代码在网页上生成图片
2015/07/01 PHP
TP5框架实现上传多张图片的方法分析
2020/03/29 PHP
javascript中全局对象的parseInt()方法使用介绍
2013/12/19 Javascript
利用jquery写的左右轮播图特效
2014/02/12 Javascript
javascript生成随机大小写字母的方法
2014/02/20 Javascript
鼠标左键单击冲突的问题解决方法(防止冒泡)
2014/05/14 Javascript
ext前台接收action传过来的json数据示例
2014/06/17 Javascript
js实现简洁的滑动门菜单(选项卡)效果代码
2015/09/04 Javascript
利用jQuery设计一个简单的web音乐播放器的实例分享
2016/03/08 Javascript
Extjs gridpanel 中的checkbox(复选框)根据某行的条件不能选中的解决方法
2017/02/17 Javascript
js原生Ajax的封装和原理详解
2017/03/11 Javascript
jQuery响应滚动条事件功能示例
2017/10/14 jQuery
利用原生js实现html5小游戏之打砖块(附源码)
2018/01/03 Javascript
Vue动态面包屑功能的实现方法
2019/07/01 Javascript
vue2.0 获取从http接口中获取数据,组件开发,路由配置方式
2019/11/04 Javascript
Vue 按照创建时间和当前时间显示操作(刚刚,几小时前,几天前)
2020/09/10 Javascript
python修改操作系统时间的方法
2015/05/18 Python
python中正则的使用指南
2016/12/04 Python
浅谈Python2之汉字编码为unicode的问题(即类似\xc3\xa4)
2019/08/12 Python
python使用opencv实现马赛克效果示例
2019/09/28 Python
python pprint模块中print()和pprint()两者的区别
2020/02/10 Python
python修改linux中文件(文件夹)的权限属性操作
2020/03/05 Python
Win10用vscode打开anaconda环境中的python出错问题的解决
2020/05/25 Python
Linux操作面试题
2012/05/16 面试题
英文自荐信
2013/12/15 职场文书
教师岗位职责范本
2013/12/29 职场文书
人力资源部培训专员岗位职责
2014/01/02 职场文书
服务宗旨标语
2014/07/01 职场文书
交通事故委托书范本(2篇)
2014/09/21 职场文书
2015年行政执法工作总结
2015/05/23 职场文书
2016幼儿园中班开学寄语
2015/12/03 职场文书
网络研修心得体会
2016/01/08 职场文书
2016年八一建军节活动总结
2016/04/05 职场文书
MySQL 如何分析查询性能
2021/05/12 MySQL