当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 相关文章推荐
一个tab标签切换效果代码
Mar 27 Javascript
在JavaScript中获取请求的URL参数[正则]
Dec 25 Javascript
innerHTML动态添加html代码和脚本兼容多个浏览器
Oct 11 Javascript
jQuery插件jPaginate实现无刷新分页
May 04 Javascript
Javascript实现可旋转的圆圈实例代码
Aug 04 Javascript
尝试动手制作javascript放大镜效果
Dec 25 Javascript
JS与jQuery实现隔行变色的方法
Sep 09 Javascript
微信小程序多张图片上传功能
Jun 07 Javascript
深究AngularJS——ng-checked(回写:带真实案例代码)
Jun 13 Javascript
用npm-run实现自动化任务的方法示例
Jan 14 Javascript
JavaScript数据结构与算法之二叉树遍历算法详解【先序、中序、后序】
Feb 21 Javascript
JS数组方法slice()用法实例分析
Jan 18 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
在数据量大(超过10万)的情况下
2007/01/15 PHP
CI框架数据库查询缓存优化的方法
2016/11/21 PHP
thinkPHP+ajax实现统计页面pv浏览量的方法
2017/03/15 PHP
PHP中error_reporting函数用法详细介绍
2017/06/11 PHP
浅析PHP开发规范
2018/02/05 PHP
用Javscript实现表单复选框的全选功能
2007/05/25 Javascript
犀利的js 函数集合
2009/06/11 Javascript
ExtJs 3.1 XmlTreeLoader Example Error
2010/02/09 Javascript
js 模式窗口(模式对话框和非模式对话框)的使用介绍
2014/07/17 Javascript
js实现匹配时换色的输入提示特效代码
2015/08/17 Javascript
ionic在开发ios系统微信时键盘挡住输入框的解决方法(键盘弹出问题)
2016/09/06 Javascript
vue axios请求拦截实例代码
2018/03/29 Javascript
element-ui表格列金额显示两位小数的方法
2018/08/24 Javascript
VuePress 静态网站生成方法步骤
2019/02/14 Javascript
vue基础之模板和过滤器用法实例分析
2019/03/12 Javascript
Python 可爱的大小写
2008/09/06 Python
Python爬虫获取整个站点中的所有外部链接代码示例
2017/12/26 Python
详谈Python 窗体(tkinter)表格数据(Treeview)
2018/10/11 Python
django 将model转换为字典的方法示例
2018/10/16 Python
python通过移动端访问查看电脑界面
2020/01/06 Python
Python实现投影法分割图像示例(一)
2020/01/17 Python
PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译
2020/04/15 Python
Windows下pycharm安装第三方库失败(通用解决方案)
2020/09/17 Python
如何给HTML标签中的文本设置修饰线
2019/11/18 HTML / CSS
英国领先的鞋类零售商和顶级品牌的官方零售商:Wynsors
2020/02/17 全球购物
数学专业毕业生自荐信
2013/11/10 职场文书
优秀英语专业毕业生求职信
2013/11/23 职场文书
劳资员岗位职责
2015/02/13 职场文书
2016年大学自主招生自荐信范文
2015/03/24 职场文书
2015年度村委会工作总结
2015/04/29 职场文书
观看禁毒宣传片后的感想
2015/08/11 职场文书
2016七一建党节慰问信
2015/11/30 职场文书
2016元旦晚会主持词开场白和结束语
2015/12/04 职场文书
python之json文件转xml文件案例讲解
2021/08/07 Python
Tomcat执行startup.bat出现闪退的原因及解决办法
2022/04/20 Servers
Pytorch中expand()的使用(扩展某个维度)
2022/07/15 Python