ajax怎么会突然出现401,当jquery ajax遇上401请求

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&period;ajax&lpar; options &rpar; &colon; 通过 HTTP 请求加载远程数据

jQuery.ajax( options ) : 通过 HTTP 请求加载远程数据 这个是jQuery 的底层 AJAX 实现.简单易用的高层实现见 $.get, $.post 等. $.ajax() ...

用JQuery Ajax 与一般处理程序 请求数据无刷新,以及如何调试错误

通过 ajax() 与 一般处理程序,请求数据库数据,实现界面无刷新. Jquery ajax 请求参数详细说明 http://www.w3school.com.cn/jquery/ajax_ajax ...

简单的jquery ajax文件上传功能

/* * 图片上传 * 注意如果不加processData:false和contentType:false会报错 */ function uploadImage(image) { var imageF ...

兼容ie的jquery ajax文件上传

Ajax文件上传插件很多,但兼容性各不一样,许多是对ie不兼容的,另外项目中是要求将网页内容嵌入到桌面端应用的,这样就不允许带flash的上传插件了,如:jquery uploadify...悲剧 对 ...

ASP&period;NET 异步Web API &plus; jQuery Ajax 文件上传代码小析

该示例中实际上应用了 jquery ajax(web client) + async web api 双异步. jquery ajax post $.ajax({ type: "POST&q ...

struts2&plus;jquery&plus;ajax实现上传&amp&semi;&amp&semi;校验实例

一直以为ajax不能做上传,直到最近看了一些文章.需要引入AjaxFileUploaderV2.1.zip,下载链接:http://pan.baidu.com/s/1i3L7I2T 代码和相关配置如下 ...

jQuery ajax中的get请求方法汇总

$.get() Defination and Usage 从服务端以HTTP GET方式获取数据 Examples 请求test.php,但是忽略返回的数据 $.get("test.php& ...

Struts2 使用Jquery&plus;ajax 文件上传

话不多说 直接上代码 前台js: var formData = new FormData(); formData.append("file1",$("#file1&quo ...

jQuery选择器遇上一些特殊字符

学习jQuery过程中,发现一些特殊字符,如“.”,“#”,"(","]"等.它在选择器应用时,按照普通处理就会出错.解决办法,就是使用转义字符来处理,这有点象 ...

随机推荐

u-boot 流程分析

u-boot 介绍: 对于计算机来说 , 从一开始上机通电是无法直接启动操作系统的 , 这中间需要一个引导过程 , 嵌入式Linux系统同样离不开引导程序 ,  这个启动程序就叫启动加载程序(Boot ...

c&num; 获取 webbrowser 完整 cookie

下面的代码实现的功能确实如标题所言,但要求是获取的是当前进程内的webbrowser,跨进程或引用的ShellWindows对象无效, 哎我本来两种情况都要用,只把前者代码先记下: internal ...

POJ C程序设计进阶 编程题#1:寻找下标

编程题#1:寻找下标 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 已知一 ...

苹果开发——App内购以及验证store的收据(二)

原地址:http://zengwu3915.blog.163.com/blog/static/2783489720137605156966?suggestedreading 三. 客户端使用Store ...

Struts2文件下载浅析

Struts2极大的简化了文件上传和下载,本文将主要介绍一下Struts2文件下载的实现1.功能主要是,在下载页面点击下载后,则下载相应的文件 2.代码部分jsp页面downloadPage:< ...

Jar包转成Dll的方式&lpar;带嵌套的jar也能做&rpar; (转)

研究很好几天,终于成功了.因为写了一个Java的项目,现在要求要改写成C#版本的.但是其中用到了svnkit,svnkit是java平台的.改写成C#的话,要使用SharpSVN,但是SharpSVN ...

mysql 打开sql日志,记录所有sql

我使用的mysql版本为:5.7.11 win7环境 记录下下载地址,省得每次百度搜了:http://dev.mysql.com/downloads/installer/ mysql 默认没有开启sq ...

MySQL 快速复数据库的方法

为了方便快速复制一个数据库,可以用以下命令将db1数据库的数据以及表结构复制到newdb数据库 创建新的数据库 #mysql -u root -p123456 mysql>CREATE DATA ...

什么是XML RPC?

# -*- coding: cp936 -*- #python 27 #xiaodeng #什么是XML RPC? #中文叫:远程过程调用 #使用http协议做传输协议的rpc机制,使用xml文本的方 ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值