当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 相关文章推荐
类似框架的js代码
Nov 09 Javascript
[原创]js与自动伸缩图片 自动缩小图片的多浏览器兼容的方法总结
Mar 12 Javascript
js本身的局限性 别让javascript做太多事
Mar 23 Javascript
用jquery与css打造个性化的单选框和复选框
Oct 20 Javascript
Javascript学习笔记之 对象篇(三) : hasOwnProperty
Jun 24 Javascript
jQuery中;function($,undefined) 前面的分号的用处
Dec 17 Javascript
jQuery平滑旋转幻灯片特效代码分享
Sep 07 Javascript
Vue+mui实现图片的本地缓存示例代码
May 24 Javascript
浅谈Vue CLI 3结合Lerna进行UI框架设计
Apr 14 Javascript
vue项目前端错误收集之sentry教程详解
May 27 Javascript
微信浏览器下拉黑边解决方案 wScroollFix
Jan 21 Javascript
js动态生成表格(节点操作)
Jan 12 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
在WIN98下以apache模块方式安装php
2006/10/09 PHP
php笔记之:文章中图片处理的使用
2013/04/26 PHP
php颜色转换函数hex-rgb(将十六进制格式转成十进制格式)
2013/09/23 PHP
PHP基于ICU扩展intl快速实现汉字转拼音及按拼音首字母分组排序的方法
2017/05/03 PHP
JS实现浏览器菜单命令
2006/09/05 Javascript
JS下载文件|无刷新下载文件示例代码
2014/04/17 Javascript
jQuery解析json格式数据简单实例
2016/01/22 Javascript
详解JavaScript的AngularJS框架中的作用域与数据绑定
2016/03/04 Javascript
jQuery Ajax 实例代码 ($.ajax、$.post、$.get)
2016/04/29 Javascript
AngularJS 避繁就简的路由
2016/07/01 Javascript
JavaScript计算器网页版实现代码分享
2016/07/15 Javascript
前端设计师们最常用的JS代码汇总
2016/09/25 Javascript
Ionic学习日记实现验证码倒计时
2018/02/08 Javascript
vue实现抖音时间转盘
2019/09/08 Javascript
vue大型项目之分模块运行/打包的实现
2020/09/21 Javascript
python类和函数中使用静态变量的方法
2015/05/09 Python
Python实现读取邮箱中的邮件功能示例【含文本及附件】
2017/08/05 Python
python3 selenium 切换窗口的几种方法小结
2018/05/21 Python
Python 十六进制整数与ASCii编码字符串相互转换方法
2018/07/09 Python
Sanic框架安装与简单入门示例
2018/07/16 Python
在Python中Dataframe通过print输出多行时显示省略号的实例
2018/12/22 Python
使用python画社交网络图实例代码
2019/07/10 Python
Python坐标线性插值应用实现
2019/11/13 Python
Pytorch Tensor 输出为txt和mat格式方式
2020/01/03 Python
python实现AdaBoost算法的示例
2020/10/03 Python
详解pycharm自动import所需的库的操作方法
2020/11/30 Python
pycharm 配置svn的图文教程(手把手教你)
2021/01/15 Python
UNIX文件类型
2013/08/29 面试题
如何填写个人简历自我评价
2013/12/10 职场文书
大学生的网络创业计划书
2013/12/26 职场文书
法律顾问服务方案
2014/05/15 职场文书
运动会口号大全
2014/06/07 职场文书
中学生社会实践活动总结
2014/07/03 职场文书
中学生自我评价范文
2015/03/03 职场文书
公司开业致辞
2015/07/29 职场文书
教你在 Java 中实现 Dijkstra 最短路算法的方法
2022/04/08 Java/Android