ajax链接超时重新登录系统,处理ajax服务由于登录超时返回异常的情况

ajax技术现在已经非常普及,常用来异步加载数据,也用来异步加载页面,现在越来越流行的单页应用SPA,页面几乎全是用ajax加载进来的。对于传统页面,如果登录超时,再提交请求时,一般后台将会把用户直接转发到登录页面,而使用ajax请求页面,如果你不注意,可能一不小心,就把登录界面load到当前页面,作为当前页面的一小部分了,这显然不是我们所期望的,接来下笔者说下我是如何处理这种情况的。

先要说明的是,笔者采用了shiro框架,在用户没有登录访问需要授权的页面时,会自动转发到登录页面,当整个页面重新加载时是不会有问题的。但如果是ajax请求,就会出现上面的问题,此时我们需要前台发出ajax请求的页面能识别出这种情况,知道登录已经超时了,让用户重新去登录。

分两种情况讨论,一种是ajax加载数据,一种是ajax加载页面。关于加载数据,我们都是通过对返回的数据进行加工展示到页面上,这时我们可以在返回的数据上做文章,加上特定的符合标示,标示是登录超时的情况,但是这种方式比较麻烦,所有的ajax方法都得去进行判断。而对于加载页面的情况,我们是无法通过返回的页面内容进行判断是否是登录超时的情况(如果是通过判断返回的页面是不是登录页面未免也太不可靠了)。

笔者在想如何解决ajax加载数据情况时想到了一种方法,每个方法进行判断一来麻烦,而来对于已有方法还需进行修改,工作量太大,不可取,ajax不是可以设置全局的配置吗,于是,笔者想到,如果对于登录超时后台都返回一个错误给前台,然后前台ajax统一配置处理这个错误的方法不就可以了,事实证明是可行的。

首先后台要对于登录超时的ajax请求返回一个错误,在请求登录页面的方法里,增加了ajax方法的判断,如果是ajax请求访问登录页面的,一律给返回头加上401的status,401是http定义的未授权访问的错误(HttpStatus.UNAUTHORIZED)。这样,页面上如果登录超时,不管是请求数据还是请求页面,在后台请求自动转发到登录页面时,并不返回登录页面,而是返回了一个401的错误状态码。

然后我们在前台加上统一的ajax错误处理方法:

$.ajaxSetup({

error: function(XMLHttpRequest, textStatus, errorThrown) {

handleAjaxError(XMLHttpRequest);

}

});

function handleAjaxError(object) {

if(object.status==401) {

alert("您未登录或者登录已经超时,请前往登录界面登录!");

window.location = loginurl;

} else {

alert("出现异常,操作失败!");

}

}

这样,如果出现401错误,ajax将不会进入success方法,而进入error对应的handleAjaxError方法。

需要注意的是,如果ajax方法提供了自己的error处理方法,默认的error处理方法将不会生效,您将需要自己处理这种情况。还有,由于后台发送了401,这是一种请求错误,在浏览器请求列表里面将会把它额外标记出来,当成一次错误请求。笔者这里简单的做了提示,然后直接跳到了登录界面,这种方式会导致用户当前编辑的内容丢失,是不友好的,如果能在当前页面弹出一个小的登录框,直接在当前页登录,登录完继续操作,这样才是最合适的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当使用 AJAX 发送请求时,如果请求超时,我们可以通过设置 AJAX 的 `timeout` 属性来处理超时错误。例如: ```javascript $.ajax({ url: "example.com", timeout: 5000, // 设置超时时间为5秒 success: function(result) { console.log(result); }, error: function(jqXHR, textStatus, errorThrown) { if(textStatus === 'timeout') { console.log('请求超时!'); } else { console.log('发生了其他错误!'); } } }); ``` 在上面的代码中,我们设置了超时时间为 5 秒。如果请求在 5 秒内没有得到响应,就会触发 `error` 回调函数,并且 `textStatus` 参数的值为 `'timeout'`,我们就可以在该回调函数中处理超时错误。 如果请求超时后,我们不想重复处理错误,可以使用一个变量来记录是否已经处理超时错误。例如: ```javascript var handledTimeoutError = false; $.ajax({ url: "example.com", timeout: 5000, success: function(result) { console.log(result); }, error: function(jqXHR, textStatus, errorThrown) { if(textStatus === 'timeout' && !handledTimeoutError) { console.log('请求超时!'); handledTimeoutError = true; } else { console.log('发生了其他错误!'); } } }); ``` 在上面的代码中,我们使用一个名为 `handledTimeoutError` 的变量来记录是否已经处理超时错误。如果超时错误发生了并且 `handledTimeoutError` 的值为 `false`,我们就处理超时错误并将 `handledTimeoutError` 设置为 `true`。这样,即使请求后续再次超时,我们也不会重复处理错误。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值