当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 相关文章推荐
经常用到的JavasScript事件的翻译
Apr 09 Javascript
jQuery不间断滚动效果(模拟百度新闻支持文字/图片/垂直滚动)
Feb 05 Javascript
JS动画效果打开、关闭层的实现方法
May 09 Javascript
js实现无限级树形导航列表效果代码
Sep 23 Javascript
详解JavaScript对象序列化
Jan 19 Javascript
require、backbone等重构手机图片查看器
Nov 17 Javascript
深入理解Commonjs规范及Node模块实现
May 17 Javascript
基于JSON数据格式详解
Aug 31 Javascript
jquery实现企业定位式导航效果
Jan 01 jQuery
详解layui弹窗父子窗口之间传参数的方法
Jan 16 Javascript
基于vue打包后字体和图片资源失效问题的解决方法
Mar 06 Javascript
javascript实现超好看的3D烟花特效
Jan 01 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
十大催泪虐心动漫电影,有几部你还没看
2020/03/04 日漫
PHP使用Mysql事务实例解析
2014/09/08 PHP
php动态绑定变量的用法
2015/06/16 PHP
如何实现iframe(嵌入式帧)的自适应高度
2006/07/26 Javascript
js function使用心得
2010/05/10 Javascript
js null,undefined,字符串小结
2010/08/21 Javascript
深入理解JavaScript系列(4) 立即调用的函数表达式
2012/01/15 Javascript
jQuery 的全选(全非选)即取得被选中的值使用介绍
2013/11/12 Javascript
JS打开新窗口防止被浏览器阻止的方法
2015/01/03 Javascript
javascript操作符&quot;!~&quot;详解
2015/02/10 Javascript
avalon js实现仿微博拖动图片排序
2015/08/14 Javascript
jQuery+正则+文本框只能输入数字的实现方法
2016/10/07 Javascript
jQuery和JavaScript节点插入元素的方法对比
2016/11/18 Javascript
利用angularjs1.4制作的简易滑动门效果
2017/02/28 Javascript
微信小程序时间选择插件使用详解
2018/12/28 Javascript
nodejs搭建本地服务器并访问文件操作示例
2019/05/11 NodeJs
浅谈ECMAScript 中的Array类型
2019/06/10 Javascript
微信小程序开发中var that =this的用法详解
2020/01/18 Javascript
[06:30]DOTA2英雄梦之声_第15期_死亡先知
2014/06/21 DOTA
Python2.x和3.x下maketrans与translate函数使用上的不同
2015/04/13 Python
如何将python中的List转化成dictionary
2016/08/15 Python
python实现文件的分割与合并
2019/08/29 Python
Python imageio读取视频并进行编解码详解
2019/12/10 Python
python numpy矩阵信息说明,shape,size,dtype
2020/05/22 Python
浅谈h5自定义audio(问题及解决)
2016/08/19 HTML / CSS
EJB与JAVA BEAN的区别
2016/08/29 面试题
中医药大学毕业生自荐信
2013/11/08 职场文书
导师推荐信范文
2014/05/09 职场文书
教师考察材料范文
2014/06/03 职场文书
社区创先争优承诺书
2014/08/30 职场文书
收款委托书
2014/10/14 职场文书
大学生迟到检讨书500字
2014/10/17 职场文书
催款函范文
2015/06/24 职场文书
公司酒会主持词
2015/07/02 职场文书
PHP 时间处理类Carbon
2022/05/20 PHP
SpringBoot深入分析讲解监听器模式下
2022/07/15 Java/Android