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.ajax( options ) : 通过 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.NET 异步Web API + jQuery Ajax 文件上传代码小析
该示例中实际上应用了 jquery ajax(web client) + async web api 双异步. jquery ajax post $.ajax({ type: "POST&q ...
struts2+jquery+ajax实现上传&;&;校验实例
一直以为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+ajax 文件上传
话不多说 直接上代码 前台js: var formData = new FormData(); formData.append("file1",$("#file1&quo ...
jQuery选择器遇上一些特殊字符
学习jQuery过程中,发现一些特殊字符,如“.”,“#”,"(","]"等.它在选择器应用时,按照普通处理就会出错.解决办法,就是使用转义字符来处理,这有点象 ...
随机推荐
u-boot 流程分析
u-boot 介绍: 对于计算机来说 , 从一开始上机通电是无法直接启动操作系统的 , 这中间需要一个引导过程 , 嵌入式Linux系统同样离不开引导程序 , 这个启动程序就叫启动加载程序(Boot ...
c# 获取 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的方式(带嵌套的jar也能做) (转)
研究很好几天,终于成功了.因为写了一个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文本的方 ...
ajax怎么会突然出现401,当jquery ajax遇上401请求相关推荐
- ajax拿table里的th值,Jquery Ajax 异步设置Table中某列的值
可根据table中某列中的ID去改变某列的值! 只是参考,实际应用中不能这样做的,如果有很多行,频繁访问服务器,服务器是顶不住的! JS: $(document).ready(function () ...
- ajax传值从前台到后台乱码,jquery ajax传值,get方式后台中文乱码
经过jquery ajax传值,后台出现中文乱码,通过一番摸索后发现原来客户端浏览器经过get方式传递到项目后台时,编码格式是ISO-8859-1,须要咱们在后台通过转码才能正常使用.方法以下:jav ...
- ajax 更新页面变量,[Django 1.5] jQuery/Ajax 在Django使用 ,如何更新模板里里变量
最近希望实现一个页面局部刷新的功能,于是开始查阅ajax资料.幸好现在ajax很多功能都封装在jQuery这个库里面,我们可以很方便去调用.通过学习几个简单的小例子,可以实现简单的前端代码更新,还有重 ...
- mvc ajax提交多选,javascript – 如何使用Jquery AJAX调用MVC Action然后在MVC中提交表单?...
在我的MVC视图我有按钮: 当我点击这个按钮我需要调用一个动作,做一些东西,然后提交我的表单. 我有这个jQuery: $('#btnSave').click(function () { $.ajax ...
- $.ajax datatype默认是什么类型,理解jquery ajax中的datatype属性选项值
jquery中ajax的dataType属性用于指定服务器返回的数据类型,如果不指定,jQuery 将自动根据HTTP包MIME信息来智能判断,如果datatype选项不填写的话,会将返回的数据当成字 ...
- php ajax mysql 分页查询_PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
1.首先做主页面Ajax_pag.php 代码如下: Ajax做分页 .header{ margin-top: 20px; } 关键字: 地区代号地区名称父级代号 2.然后做分页查询JS页面Ajax_ ...
- ajax点击事件无法触发,解决jQuery Ajax动态新增节点无法触发点击事件的问题_婳祎_前端开发者...
在写ajax加载数据的时候发现,后面添加进来的demo节点元素,失去了之前的点击事件.为什么点击事件失效,我们该怎么去解决呢? 其实最简单的方法就是直接在标签中写οnclick="" ...
- ajax三种错误ie,ie下jquery ajax 80020101错误的解决方法
注意注释 删除这些注释就可以了 Windows下一个MySQL有些错误的解决方法 1.无论是什么提示.我们有一个直接看错误日志.由于它描述了最具体描述错误日志. 于MySQL安装文件夹中找到 my.i ...
- ajax拒绝访问,带CORS的IE9 jQuery AJAX返回“访问被拒绝”
带CORS的IE9 jQuery AJAX返回"访问被拒绝" 以下适用于IE以外的所有浏览器(我在IE 9中测试).jQuery.support.cors = true;... $ ...
- ajax token验证实例,实例详解jQuery Ajax使用Token验证身份
因为最近做了几个后台,所以经常会涉及到Token验证身份操作后台,所以这里记录一个如何向后台传请求头和Token.本文主要介绍了jQuery Ajax使用Token验证身份实例代码,需要的朋友可以参考 ...
最新文章
- Apache Ant安装 验证
- 使用 Apache OpenJPA 开发 EJB 3.0 应用,第 6 部分: 处理实体生命周期事件的回调
- android实现自动抢红包,Android手机辅助功能实现自动抢微信红包功能
- android 名片识别 简书,iOS 自己实现 名片识别 三 图片处理
- matlab第七章符号对象,MATLAB语言:第七章 MATLAB符号计算
- Linxu入门(一)
- linux 常用到的命令(centos 6.5)
- 由于域安全组嵌套导致SPS访问控制群组和用户配置文件搜索失败
- RSA密钥的数据类型转换:由合法的string到PublicKey或PrivateKey
- 测试人员必掌握的测试文档
- hbase数据库详解
- 从行业到技术,10+年资深工程师带你进行嵌入式行业职业规划!
- Vulkan 基本原理
- vivo市场API事件上报对接
- 一级建造师能挂靠到三级资质的企业吗?
- JavaScript中用数组实现键值对
- 游戏中的抗锯齿技术Anti-Alasing提炼总结
- Django-应用app名配置中文显示
- 【解决方案】英文论文投稿提交中显示“ unauthorized content”——投稿系统Editorial Manager
- android 开红包动画,Android实现红包雨动画效果