前言

之前在项目中遇到一个问题,就是在项目中为了安全起见,设置session的有效期限,当用户登录超过这个有效期限,希望用户重新验证自己的身份,证明是本人的操作,需要要用户重新登陆,即当session过期时,用户操作与服务器发生交互,服务器返回401的状态码,跳转回到登录页面,让用户重新登陆的过程,这并不难实现,且看如下代码:

$.ajax({
    url:'请求地址',
    type:'POST',
    data:null,//向服务器发送的数据,这里用于演示,设为null
    success:function(data){
        //请求成功
    },
    error:function(xhr, textStatus, errorThrown){
        //请求失败
        //通过状态码判断401
        if (xhr.status === 401) {
            alert('您好,身份验证已过期,请重新登陆。');
            //返回首页
            window.location.href = '首页的地址';
        }
    }
});

这样就很轻松的实现了需求,但是,现在问题来了,当项目中已经写了成百上千的ajax请求时,有的是$.load函数,有的是$.loadScript或$.get等等,领导说要做这个功能,你怎么办?一个个在error的函数中加401状态判断的代码吗?那样可以把自己玩死,这时很容易就想到,重写jquery的ajax方法,但是为什么是$.ajax()这个方法呢?因为这个方法是jquery ajax请求的最底层的方法。代码如下:

//重写ajax方法
jQuery(function($) {
    // 备份jquery的ajax方法
    var _ajax = $.ajax;
    $.ajax = function(opt) {
        var _error = opt && opt.error || function(a, b, c) {};
        //修改传入对象的error函数
        var _opt = $.extend(opt, {
            error: function(xhr, textStatus, errorThrown) {
                //通过状态码判断401
                if (xhr.status === 401) {
                    alert('您好,身份验证已过期,请重新登陆。');
                    //返回首页
                    window.location.href = '首页的地址';
                    return;
                }
                _error(xhr, textStatus, errorThrown);
            }
        });
        //注意这里需要返回_ajax(_opt),否则在链式调用时会报错
        return _ajax(_opt);
    };
});

这样就不需要在每个ajax请求的方法中添加状态码判断的代码了,由此可见,在代码编程中重写框架的方法也是很重要的一项技能。

参考链接 http://blog.csdn.net/nohero1/article/details/41517163


本文转载:CSDN博客