×
文章路径: WEB前端 > JS

处理ajax服务由于登录超时返回异常的情况

发表于1年前(Feb 26, 2017 12:04:08 PM)  阅读 763  评论 0

分类: JS Java WEB前端

标签: ajax 登录超时 401 UNAUTHORIZED

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,这是一种请求错误,在浏览器请求列表里面将会把它额外标记出来,当成一次错误请求。笔者这里简单的做了提示,然后直接跳到了登录界面,这种方式会导致用户当前编辑的内容丢失,是不友好的,如果能在当前页面弹出一个小的登录框,直接在当前页登录,登录完继续操作,这样才是最合适的。

发表评论