当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 拖动表格行实现代码
May 05 Javascript
jQuery版仿Path菜单效果
Dec 15 Javascript
JQUERY 实现窗口滚动搜索框停靠效果(类似滚动停靠)
Mar 27 Javascript
网页实时显示服务器时间和javscript自运行时钟
Jun 09 Javascript
Javascript中setTimeOut和setInterval的定时器用法
Jun 12 Javascript
微信小程序 前端源码逻辑和工作流详解
Oct 08 Javascript
微信小程序 swiper组件详解及实例代码
Oct 25 Javascript
真正好用的js验证上传文件大小的简单方法
Oct 27 Javascript
Bootstrap和Java分页实例第二篇
Dec 23 Javascript
AngularJs 利用百度地图API 定位当前位置 获取地址信息
Jan 18 Javascript
vue将对象新增的属性添加到检测序列的方法
Feb 24 Javascript
vue+iview实现文件上传
Nov 17 Vue.js
基于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面试题(对属性或方法的访问控制)
2012/09/13 PHP
基于PHPexecl类生成复杂的报表表头示例
2016/10/14 PHP
php curl发送请求实例方法
2019/08/01 PHP
JavaScript监测ActiveX控件是否已经安装过的代码
2008/09/02 Javascript
js利用与或运算符优先级实现if else条件判断表达式
2010/04/15 Javascript
javascript跑马灯悬停放大效果实现代码
2012/12/12 Javascript
jQuery焦点图切换特效插件封装实例
2013/08/18 Javascript
js模拟点击以提交表单为例兼容主流浏览器
2013/11/29 Javascript
利用原生JavaScript获取元素样式只是获取而已
2014/10/08 Javascript
javascript实现简单的鼠标拖动效果实例
2015/04/10 Javascript
jquery动态遍历Json对象的属性和值的方法
2016/07/27 Javascript
JS中微信小程序自定义底部弹出框
2016/12/22 Javascript
jquery实现倒计时小应用
2017/09/19 jQuery
[原创]jquery判断元素内容是否为空的方法
2018/05/04 jQuery
通过nodejs 服务器读取HTML文件渲染到页面的方法
2018/05/17 NodeJs
angularjs获取到My97DatePicker选中的值方法
2018/10/02 Javascript
微信小程序实现单列下拉菜单效果
2019/04/25 Javascript
使用 js 简单的实现 bind、call 、aplly代码实例
2019/09/07 Javascript
JavaScript之scrollTop、scrollHeight、offsetTop、offsetHeight等属性学习笔记
2020/07/15 Javascript
利用Tkinter(python3.6)实现一个简单计算器
2017/12/21 Python
Python中shapefile转换geojson的示例
2019/01/03 Python
pygame实现五子棋游戏
2019/10/29 Python
Python 中Operator模块的使用
2021/01/30 Python
美国时尚配饰品牌:Dooney & Bourke
2017/11/14 全球购物
C#面试题
2016/05/06 面试题
销售人员自我评价怎么写
2013/09/19 职场文书
大学毕业的自我鉴定
2013/10/08 职场文书
英语专业学生个人求职信
2014/01/28 职场文书
城建学院毕业生自荐信
2014/01/31 职场文书
好的促销活动方案
2014/08/21 职场文书
领导干部群众路线剖析材料
2014/10/09 职场文书
学习十八大标语
2014/10/09 职场文书
2014小学教师年度考核工作总结
2014/12/03 职场文书
升职自荐信范文
2015/03/27 职场文书
奥巴马开学演讲观后感
2015/06/12 职场文书
SpringAop日志找不到方法的处理
2021/06/21 Java/Android