当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 相关文章推荐
通过ifame指向的页面高度调整iframe的高度
Oct 05 Javascript
syntaxhighlighter 使用方法
Jul 02 Javascript
asp.net和asp下ACCESS的参数化查询
Jun 11 Javascript
简介JavaScript中的italics()方法的使用
Jun 08 Javascript
一起学写js Calender日历控件
Apr 14 Javascript
微信小程序 页面跳转传递值几种方法详解
Jan 12 Javascript
浅谈webpack打包之后的文件过大的解决方法
Mar 07 Javascript
Servlet3.0与纯javascript通过Ajax交互的实例详解
Mar 18 Javascript
Vue项目数据动态过滤实践及实现思路
Sep 11 Javascript
微信小程序实现发送验证码按钮效果
Dec 20 Javascript
浅谈Vue页面级缓存解决方案feb-alive(上)
Apr 14 Javascript
JavaScript实现拖拽盒子效果
Feb 06 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
自己前几天写的无限分类类
2007/02/14 PHP
php 读取shell管道传输过来的内容
2010/03/01 PHP
解析php DOMElement 操作xml 文档的实现代码
2013/05/10 PHP
PHP控制前台弹出对话框的实现方法
2016/08/21 PHP
javascritp实现input输入框相关限制用法
2007/06/29 Javascript
JS弹出对话框返回值代码(asp.net后台)
2010/12/28 Javascript
file控件选择上传文件确定后触发的js事件是哪个
2014/03/17 Javascript
Javascript动态引用CSS文件的2种方法介绍
2014/06/06 Javascript
a标签click和href执行顺序探讨
2014/06/23 Javascript
js实现div弹出层的方法
2014/11/20 Javascript
node.js中的querystring.parse方法使用说明
2014/12/10 Javascript
jQuery中change事件用法实例
2014/12/26 Javascript
Javascript基础教程之数据类型 (布尔型 Boolean)
2015/01/18 Javascript
全面了解addEventListener和on的区别
2016/07/14 Javascript
微信小程序 教程之模块化
2016/10/17 Javascript
微信小程序 数据交互与渲染实例详解
2017/01/21 Javascript
js 递归和定时器的实例解析
2017/02/03 Javascript
JavaScript实现二维坐标点排序效果
2017/07/18 Javascript
微信小程序实现轮播图效果
2017/09/07 Javascript
微信小程序实现列表下拉刷新上拉加载
2020/07/29 Javascript
JS中利用FileReader实现上传图片前本地预览功能
2018/03/02 Javascript
详解webpack打包nodejs项目(前端代码)
2018/09/19 NodeJs
layer弹出层自定义提交取消按钮的例子
2019/09/10 Javascript
Python将xml和xsl转换为html的方法
2015/03/10 Python
在cmd命令行里进入和退出Python程序的方法
2018/05/12 Python
python3.x提取中文的正则表达式示例代码
2019/07/23 Python
python pyqtgraph 保存图片到本地的实例
2020/03/14 Python
html5服务器推送_动力节点Java学院整理
2017/07/12 HTML / CSS
美国肌肉和力量商店:Muscle & Strength
2019/06/22 全球购物
2014年团工作总结
2014/11/27 职场文书
家长对孩子的寄语
2015/02/26 职场文书
刮痧观后感
2015/06/05 职场文书
教你使用Python pypinyin库实现汉字转拼音
2021/05/27 Python
Python字典和列表性能之间的比较
2021/06/07 Python
教你快速构建一个基于nginx的web集群项目
2021/11/27 Servers
Python matplotlib安装以及实现简单曲线的绘制
2022/04/26 Python