使用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();
				});
			}
		}
	});
});


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值