当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 相关文章推荐
javascript 面向对象继承
Nov 26 Javascript
一个简单的js鼠标划过切换效果
Jun 30 Javascript
用函数模板,写一个简单高效的 JSON 查询器的方法介绍
Apr 17 Javascript
node.js中的fs.realpathSync方法使用说明
Dec 16 Javascript
DOM节点的替换或修改函数replaceChild()用法实例
Jan 12 Javascript
微信小程序使用第三方库Immutable.js实例详解
Sep 27 Javascript
js实现table添加行tr、删除行tr、清空行tr的简单实例
Oct 15 Javascript
JavaScript实现快速排序的方法分析
Jan 10 Javascript
vue-router中的hash和history两种模式的区别
Jul 17 Javascript
JavaScript中的null和undefined用法解析
Sep 30 Javascript
浅谈layui 表单元素的选中问题
Oct 25 Javascript
JS实现“全选”和&quot;全不选&quot;功能代码实例
Feb 06 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
德劲1103的维修打理经验
2021/03/02 无线电
把PHP安装为Apache DSO
2006/10/09 PHP
Zend Framework入门教程之Zend_Config组件用法详解
2016/12/09 PHP
PHP获取文本框、密码域、按钮的值实例代码
2017/04/19 PHP
PHP调用API接口实现天气查询功能的示例
2017/09/21 PHP
php微信开发之关注事件
2018/06/14 PHP
文件编码导致jquery失效的解决方法
2013/06/26 Javascript
js showModalDialog参数的使用详解
2014/01/07 Javascript
javascript随机之洗牌算法深入分析
2014/06/07 Javascript
JavaScript italics方法入门实例(把字符串显示为斜体)
2014/10/17 Javascript
对比分析json及XML
2014/11/28 Javascript
javascript去除字符串左右两端的空格
2015/02/05 Javascript
JavaScript数组常用方法
2015/03/02 Javascript
jquery简单实现幻灯片的方法
2015/08/03 Javascript
jQuery Ajax Post 回调函数不执行问题的解决方法
2016/08/15 Javascript
webpack搭建vue 项目的步骤
2017/12/27 Javascript
ios中视频的最后一桢问题解决
2019/05/14 Javascript
layui的表单验证支持ajax判断用户名是否重复的实例
2019/09/06 Javascript
Vue中Table组件行内右键菜单实现方法(基于 vue + AntDesign)
2019/11/21 Javascript
通过vue刷新左侧菜单栏操作
2020/08/06 Javascript
详解React的回调渲染模式
2020/09/10 Javascript
利用python批量检查网站的可用性
2016/09/09 Python
启动targetcli时遇到错误解决办法
2017/10/26 Python
解决Pycharm无法import自己安装的第三方module问题
2018/05/18 Python
python 缺失值处理的方法(Imputation)
2019/07/02 Python
python变量命名的7条建议
2019/07/04 Python
使用python-opencv读取视频,计算视频总帧数及FPS的实现
2019/12/10 Python
将python字符串转化成长表达式的函数eval实例
2020/05/11 Python
浅谈html5 video 移动端填坑记
2018/01/15 HTML / CSS
Amcal中文官网:澳洲综合性连锁药房
2019/03/28 全球购物
高级技校毕业生自荐信
2013/11/18 职场文书
关于中国梦的演讲稿
2014/04/23 职场文书
公务员年度个人总结
2015/02/12 职场文书
考勤制度通知
2015/04/25 职场文书
python tqdm用法及实例详解
2021/06/16 Python
Go语言并发编程 sync.Once
2021/10/16 Golang