当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 相关文章推荐
裁剪字符串trim()自定义改进版
Apr 10 Javascript
jQuery中:submit选择器用法实例
Jan 03 Javascript
JS JQUERY实现滚动条自动滚到底的方法
Jan 09 Javascript
JavaScript中switch语句的用法详解
Jun 03 Javascript
jQuery基于ajax实现星星评论代码
Aug 07 Javascript
JavaScript学习笔记之创建对象
Mar 25 Javascript
JavaScript实现的商品抢购倒计时功能示例
Apr 17 Javascript
关于RxJS Subject的学习笔记
Dec 05 Javascript
基于elementUI实现图片预览组件的示例代码
Mar 31 Javascript
js实现轮播图特效
May 28 Javascript
JavaScript代码模拟鼠标自动点击事件示例
Aug 07 Javascript
vue实现lodop打印功能的示例
Nov 11 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
PHP中$_SERVER的详细参数与说明介绍
2013/10/26 PHP
PHP 中魔术常量的实例详解
2017/10/26 PHP
laravel利用中间件防止未登录用户直接访问后台的方法
2019/09/30 PHP
最近项目写了一些js,水平有待提高
2009/01/31 Javascript
JQuery Study Notes 学习笔记(一)
2010/08/04 Javascript
分享28款免费实用的 JQuery 图片和内容滑块插件
2014/12/15 Javascript
初步了解javascript面向对象
2015/11/09 Javascript
WEB前端开发框架Bootstrap3 VS Foundation5
2016/05/16 Javascript
jQuery中过滤器的基本用法示例
2017/10/11 jQuery
JavaScript实现的DOM绘制柱状图效果示例
2018/08/08 Javascript
基于element-ui封装可搜索的懒加载tree组件的实现
2020/05/22 Javascript
Vue 同步异步存值取值实现案例
2020/08/05 Javascript
[02:16]DOTA2英雄基础教程 干扰者
2014/01/15 DOTA
python重试装饰器示例
2014/02/11 Python
举例讲解Python中is和id的用法
2015/04/03 Python
详解Python中的正则表达式的用法
2015/04/09 Python
Python使用ntplib库同步校准当地时间的方法
2016/07/02 Python
Python执行时间的计算方法小结
2017/03/17 Python
Python实现求数列和的方法示例
2018/01/12 Python
python中字符串变二维数组的实例讲解
2018/04/03 Python
Python3 利用requests 库进行post携带账号密码请求数据的方法
2018/10/26 Python
python按照多个条件排序的方法
2019/02/08 Python
利用Tensorflow的队列多线程读取数据方式
2020/02/05 Python
基于Python实现2种反转链表方法代码实例
2020/07/06 Python
Python3爬虫里关于代理的设置总结
2020/07/30 Python
农村婚礼证婚词
2014/01/10 职场文书
给老师的检讨书
2014/02/11 职场文书
战略合作意向书
2014/07/29 职场文书
活动总结结尾怎么写
2014/08/30 职场文书
2015年社区综治宣传月活动总结
2015/03/25 职场文书
酒店总经理岗位职责
2015/04/01 职场文书
军训结束新闻稿
2015/07/17 职场文书
15个值得收藏的JavaScript函数
2021/09/15 Javascript
nginx内存池源码解析
2021/11/20 Servers
德劲DE1102数字调谐收音机机评
2022/04/07 无线电
联想win10摄像头打不开怎么办?win10笔记本摄像头打不开解决办法
2022/04/08 数码科技