当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 相关文章推荐
吐槽一下我所了解的Node.js
Oct 08 Javascript
利用JavaScript的AngularJS库制作电子名片的方法
Jun 18 Javascript
js实现的动画导航菜单效果代码
Sep 10 Javascript
JavaScript知识点总结(十一)之js中的Object类详解
May 31 Javascript
javascript三种代码注释方法
Jun 02 Javascript
深入理解AngularJS中的ng-bind-html指令和$sce服务
Sep 08 Javascript
JS检测window.open打开的窗口是否关闭
Jun 25 Javascript
Angularjs上传图片实例详解
Aug 06 Javascript
分析JS单线程异步io回调的特性
Dec 01 Javascript
如何在vue中使用ts的示例代码
Feb 28 Javascript
Javascript删除数组里的某个元素
Feb 28 Javascript
Vue作用域插槽实现方法及作用详解
Jul 08 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 广告调用类代码(支持Flash调用)
2011/08/11 PHP
PHP使用Mysqli类库实现完美分页效果的方法
2016/04/07 PHP
javascript在一段文字中的光标处插入其他文字
2007/08/26 Javascript
js写的评论分页(还不错)
2013/12/23 Javascript
javascript实现的字符串与十六进制表示字符串相互转换方法
2015/07/17 Javascript
jquery 表单验证之通过 class验证表单不为空
2015/11/02 Javascript
JavaScript中三种异步上传文件方式
2016/03/06 Javascript
关于Jquery中的bind(),on()绑定事件方式总结
2016/10/26 Javascript
解析预加载显示图片艺术
2016/12/05 Javascript
nodejs简单实现TCP服务器端和客户端的聊天功能示例
2018/01/04 NodeJs
Vue通过ref父子组件拿值方法
2018/09/12 Javascript
jQuery序列化form表单数据为JSON对象的实现方法
2018/09/20 jQuery
Vue 动态组件与 v-once 指令的实现
2019/02/12 Javascript
JS实现的杨辉三角【帕斯卡三角形】算法示例
2019/02/26 Javascript
原生js添加一个或多个类名的方法分析
2019/07/30 Javascript
python中xrange和range的区别
2014/05/13 Python
Python的加密模块md5、sha、crypt使用实例
2014/09/28 Python
python自定义解析简单xml格式文件的方法
2015/05/11 Python
python迭代dict的key和value的方法
2018/07/06 Python
解决Python中定时任务线程无法自动退出的问题
2019/02/18 Python
Python3分析处理声音数据的例子
2019/08/27 Python
python 爬虫 实现增量去重和定时爬取实例
2020/02/28 Python
使用python执行shell脚本 并动态传参 及subprocess的使用详解
2020/03/06 Python
Python多线程的退出控制实现
2020/08/10 Python
HTML5制作酷炫音频播放器插件图文教程
2014/12/30 HTML / CSS
Herve Leger官网:标志性绷带连衣裙等
2018/12/26 全球购物
工程力学专业毕业生求职信
2013/10/06 职场文书
怎样写好创业计划书的内容
2014/02/06 职场文书
评析教师个人的自我评价
2014/02/19 职场文书
2014年十一国庆节活动方案
2014/09/16 职场文书
会计岗位职责
2015/02/03 职场文书
大学生自我推荐信范文
2015/03/24 职场文书
简历自我评价范文
2019/04/24 职场文书
pyqt5蒙版遮罩mask,setmask的使用
2021/06/11 Python
JS前端使用canvas实现扩展物体类和事件派发
2022/08/05 Javascript
Python使用plt.boxplot()函数绘制箱图、常用方法以及含义详解
2022/08/14 Python