当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 string 扩展库代码
Apr 09 Javascript
JS随机生成不重复数据的实例方法
Jul 17 Javascript
js判断字符长度以及中英文数字等
Dec 31 Javascript
jquery select 设置默认选中的示例代码
Feb 07 Javascript
关于jQuery中的each方法(jQuery到底干了什么)
Mar 05 Javascript
ie浏览器使用js导出网页到excel并打印
Mar 11 Javascript
JS自动倒计时30秒后按钮才可用(两种场景)
Aug 31 Javascript
前端js文件合并的三种方式推荐
May 19 Javascript
JavaScript中的对象继承关系
Aug 01 Javascript
微信小程序 基础知识css样式media标签
Feb 15 Javascript
js实现二级导航功能
Mar 03 Javascript
JS实现打砖块游戏
Feb 14 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统计时间和内存使用情况示例分享
2014/03/13 PHP
Yii遍历行下每列数据的方法
2016/10/17 PHP
分析php://output和php://stdout的区别
2018/05/06 PHP
JavaScript中的substr()方法使用详解
2015/06/06 Javascript
bootstrap选项卡扩展功能详解
2017/06/14 Javascript
在vue中实现简单页面逆传值的方法
2017/11/27 Javascript
Laravel整合Bootstrap 4的完整方案(推荐)
2018/01/25 Javascript
Servlet3.0与纯javascript通过Ajax交互的实例详解
2018/03/18 Javascript
微信小程序自定义toast弹窗效果的实现代码
2018/11/15 Javascript
Vue.js 中的 v-show 指令及用法详解
2018/11/19 Javascript
初探Vue3.0 中的一大亮点Proxy的使用
2018/12/06 Javascript
JQuery实现ajax请求的示例和注意事项
2018/12/10 jQuery
Vue.js特性Scoped Slots的浅析
2019/02/20 Javascript
vue 项目 iOS WKWebView 加载
2019/04/17 Javascript
基于Taro的微信小程序模板消息-获取formId功能模块封装实践
2019/07/15 Javascript
Vue.js中Line第三方登录api的实现代码
2020/06/29 Javascript
React倒计时功能实现代码——解耦通用
2020/09/18 Javascript
VUE前端从后台请求过来的数据进行转换数据结构操作
2020/11/11 Javascript
[01:57]DOTA2上海特锦赛小组赛解说单车采访花絮
2016/02/27 DOTA
python映射列表实例分析
2015/01/26 Python
Python将文本去空格并保存到txt文件中的实例
2018/07/24 Python
Python 正则表达式匹配字符串中的http链接方法
2018/12/25 Python
python爬虫简单的添加代理进行访问的实现代码
2019/04/04 Python
解决pycharm最左侧Tool Buttons显示不全的问题
2019/12/17 Python
python 常见的反爬虫策略
2020/09/27 Python
Zavvi美国:英国娱乐之家
2017/03/19 全球购物
数据库基础的一些面试题
2012/02/25 面试题
医学专业本科毕业生自我鉴定
2013/12/28 职场文书
触摸春天教学反思
2014/02/03 职场文书
2014年9.18纪念日演讲稿
2014/09/14 职场文书
2014最新版群众路线四风整改措施
2014/09/24 职场文书
离婚律师函范本
2015/05/27 职场文书
小学生读书笔记
2015/07/01 职场文书
师德师风心得体会(2016精选篇)
2016/01/12 职场文书
导游词书写之黄山
2019/08/06 职场文书
PostgreSQL数据库去除重复数据和运算符的基本查询操作
2022/04/12 PostgreSQL