使用jQuery Ajax过滤实现REST不间断会话

使用jQuery Ajax过滤实现REST不间断会话

当客户端与服务端的会话超时,发出一个Ajax数据请求,遇到403状态码怎么办?

在Shell终端里,超级管理员会话超时时,会自动显示密码输入确认。对页面来说,是要捕获每个状态码为403的失败请求,待登陆成功后一个个replay,还是在登陆成功后直接刷新页面?

jQuery发展到今天,应该会提供处理这种业务的功能。果然找到madpilot rants一篇文章,这些问题都迎刃而解。

具体过程是:

当请求遇到403错误后,会被放入403队列,并弹出登陆框,当登陆成功后,会自动重发队列中未成功的请求。

不过这个方案目前有一定缺陷:它不支持使用Promise风格添加success回调,success回调得写在options里面,也就是说:

//支持
jQuery.ajax("/foo.json",{
	success: function(data){
		//TODO
	}
});
//而不支持
jQuery.ajax("/foo.json").done(function(data){
	//TODO
});

以下方案参考了rants的方案,并考虑到了并发请求都403失败的情形:

require(["jquery"],function($){
	//Thanks @madpilot rants
	//See http://myles.eftos.id.au/blog/2011/11/30/how-to-re-play-an-ajax-request-in-jquery-after-an-authentication-error/#.U-iHifmSx8E
	var isDialogShown=false;
	var ajaxQueue=[];
	jQuery.ajaxSetup({
		statusCode:{
			//未登录或登陆后session失效时,服务端会返回状态码403
			403:function(){
				ajaxQueue.push(this);
				if(isDialogShown){return;}
				isDialogShown=true;
				require(["infrastructure/user/LoginDialog"],function(LoginDialog){
					var dialog=new LoginDialog("loginDialog",{
						onfullfilled:function (){
							isDialogShown=false;
							ajaxQueue.forEach(function(context){
								$.ajax(context);
							});
							ajaxQueue.length=0;
						},
						onrejected:function(){

						}
					});
					dialog.placeAt(document.body,"beforeEnd")
					dialog.open();
				});
			}
		}
	});
});

使用jQuery Ajax过滤实现REST不间断会话

时间: 2024-10-10 17:18:04

使用jQuery Ajax过滤实现REST不间断会话的相关文章

jQuery ajax传递特殊字符串问题

当你用ajax传递值到服务器端,如果值中包含特殊字符串如+,&等,在服务器端获取的结果可能就会出现差异,因为这些字符有其它用途,如“+”表示连接符,在转义后你获取到的就是空格.可以看看这些特殊字符与十六进制的关系: + 空格 / ? % & = # %2B %20 %2F %3F %25 %26 &3D %23 如果变量中确实需要包含这些特殊字符,请用encodeURIComponent()函数过滤,它会对这些字符编码,服务器端是会被自动解码的,不需要处理.另外,尽量提交json格

jQuery.ajax()方法中参数详细解析

前言 在项目开发中,为了实现异步向服务端发起请求,最经常使用的就是jQuery.ajax方法了.刚开始需求比较简单,调用jQuery.ajax方法时要传的参数也就那几个常见的参数:url/data/dataType/type/cache/timeout.当时感觉这个接口使用起来很简单,直到最近项目中要实现一个发送 formData数据到服务端的需求时,我发现自己错了....原来jQuery.ajax方法中除了我用过的那几个外,还有如此之多!!于是我决定要去jQuery官网好好看看都有哪些我不知道

JS jquery ajax

4.form中的input可以设置为readonly和disable,请问2者有什么区别? readonly不可编辑,但可以选择和复制:值可以传递到后台 disabled不能编辑,不能复制,不能选择:值不可以传递到后台 5.js中的3种弹出式消息提醒(警告窗口,确认窗口,信息输入窗口)的命令式什么? alertconfirmprompt 2.列举Java和JavaScript之间的区别? Java是一门十分完整.成熟的编程语言.相比之下,JavaScript是一个可以被引入HTML页面的编程语言

jquery ajax 方法及各参数详解

jquery ajax 方法及各参数详解 1.$.ajax() 只有一个参数:参数 key/value 对象,包含各配置及回调函数信息. 参数列表: 参数名 类型 描述 url String (默认: 当前页地址) 发送请求的地址. type String (默认: "GET") 请求方式 ("POST" 或 "GET"), 默认为 "GET".注意:其它 HTTP 请求方法,如 PUT 和 DELETE 也可以使用,但仅部分

Django1.7+JQuery+Ajax集成小例子

Ajax的出现让Web展现了更新的活力,基本所有的语言,都动态支持Ajax与起服务端进行通信,并在页面实现无刷新动态交互. 下面是散仙使用Django+Jquery+Ajax的方式来模拟实现了一个验证用户注册时,用户名存在不存在的一个小应用.注意,验证存在不存在使用的是Ajax的方式,不用让用户点击按钮验证是否存在. 截图如下: 页面HTML代码如下: <!DOCTYPE html> <html> <head lang="en"> <meta

JQuery ajax 在aspx中传值和取值

传值:ajax中的data(json)  js代码: <script type="text/javascript"> $(function () { $("#btnAddNews").bind("click", function () { var _name= $.trim($("#txtNewTitle").val()); $.ajax({ type: "POST", url: "A

jquery ajax跨域的完美解决方法(jsonp方式)

ajax跨域请求的问题,JQuery对于Ajax的跨域请求有两类解决方案,不过都是只支持get方式,接下来为大家详细介绍下客户端JQuery.ajax的调用代码 今天在项目中需要做远程数据加载并渲染页面,直到开发阶段才意识到ajax跨域请求的问题,隐约记得Jquery有提过一个ajax跨域请求的解决方式,于是即刻翻出Jquery的API出来研究,发 JQuery对于Ajax的跨域请求有两类解决方案,不过都是只支持get方式.分别是JQuery的 jquery.ajax jsonp格式和jquer

jQuery Ajax 全解析

jQuery Ajax 全解析 本文地址: jQuery Ajax 全解析 本文作者:QLeelulu 转载请标明出处! jQuery确实是一个挺好的轻量级的JS框架,能帮助我们快速的开发JS应用,并在一定程度上改变了我们写JavaScript代码的习惯. 废话少说,直接进入正题,我们先来看一些简单的方法,这些方法都是对jQuery.ajax()进行封装以方便我们使用的方法,当然,如果要处理复杂的逻辑,还是需要用到jQuery.ajax()的(这个后面会说到). 1. load( url, [d

jQuery Ajax -附示例

jQuery其实就是一个JavaScript的类库,其将复杂的功能做了上层封装,使得开发者可以在其基础上写更少的代码实现更多的功能. jQuery 不是生产者,而是大自然搬运工. jQuery Ajax本质 XMLHttpRequest 或 ActiveXObject 注:2.+版本不再支持IE9以下的浏览器 时机: 如果发送的是[普通数据] -> jQuery,XMLHttpRequest,iframe 如果发送的是[文件] -> iframe,jQuery(FormData对象),XMLH