js 檢查登陸態方法封裝(閉包、狀態緩存)

前端頁面開發時,常常須要異步校驗登陸態,每次都從新copy以前寫的方法,比較繁瑣很差維護,固將登陸態校驗封裝成一個js。前端

(function(){
    //登陸狀態 1 登陸態有效 2 登陸態無效 3 請求超時
    var status;
    //狀態到期時間戳
    var status_exprie_timestamp;
    //默認超時時間(秒數)
    var default_exprie_time = 60;
    //限定協議名只能爲https 或 http
    var lp = "https:" == document.location.protocol ? 'https:' : 'http:';

    //檢測是否登陸
    //login_user_id 用戶id | session_id 會話id | callback 成功失敗超時後的回調函數
    //超時時間5秒
    function check_login(login_user_id,session_id,callback){
        //有狀態 且 未過時 且 狀態不爲3(請求超時) 直接調用callback不更新過時時間戳
        if(status && !status_is_expire() && status != 3){
            callback(status);
            return ;
        }

        //格式判斷
        if(!check_login_user_id(login_user_id) || !check_session_id(session_id)){
            exec(2,callback);
            return ;
        }

        //構建請求相關的變量
        var ajax_url = lp+'//host/xxx';
        var data = {
            'login_user_id':login_user_id,
            'session_id':session_id,
            'onlyjson':0,
            't':new Date().getTime()
        };

        //請求
        $.ajax({
            type : "get",
            url : ajax_url,
            data : data,
            timeout : 5000,
            dataType : "jsonp",
            success : function(data){
                if(data.rtn==0){
                    exec(1,callback);
                }else{
                    exec(2,callback);
                }
            },
            error:function(data, error_type, xhr){
                if(error_type=='timeout'){
                    exec(3,callback);
                }else{
                    exec(2,callback);
                }
            }
        });
    }

    // 同check_login 但不須要傳login_user_id 和 session_id
    function esay_check_login(callback){
        var login_user_id = get_login_user_id();
        var session_id = get_session_id();
        check_login(login_user_id,session_id,callback);
    }

    //判斷用戶id格式
    function check_login_user_id(login_user_id){
        return /^[0-9]{4,}$/.test(login_user_id);
    }

    //判斷會話id格式
    function check_session_id(session_id){
        return /^[0-9a-fA-F]{20,40}$/.test(session_id);
    }

    //獲取用戶id
    function get_login_user_id(){
        return _get('login_user_id') ? _get('login_user_id') : getCookie('login_user_id');
    }

    //獲取會話id
    function get_session_id(){
        return _get('session_id') ? _get('session_id') : getCookie('session_id');
    }

    //獲取當前的時間戳(秒) 
    //add_sec 可選 爲當前時間戳(秒)加上相應的秒數
    function get_now_timestamp(add_sec){
        var timestamp = Date.parse(new Date())/1000;
        if(add_sec && !isNaN(add_sec)){
            timestamp +=  parseInt(add_sec);
        }
        return timestamp;
    }

    //判斷狀態是否超時
    function status_is_expire(){
        var now_timestamp = get_now_timestamp();
        return status_exprie_timestamp && now_timestamp>=status_exprie_timestamp ? true : false;
    }

    //獲取query參數方法
    function _get(name){
        var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");
        var r = window.location.search.substr(1).match(reg);
        if(r!=null)return  unescape(r[2]); return null;
    }

    //設置狀態、超時時間 且 調用回調函數
    function exec(_status,callback){
        status = _status;
        status_exprie_timestamp = get_now_timestamp(default_exprie_time);
        callback(status);
    }

    //獲取指定名稱的cookie
    function getCookie(name){ 
        var arr=document.cookie.split('; ');
        if(!arr)return false;
        for(var i=0;i<arr.length;i++){ 
            var one=arr[i].split('='); 
            if(one[0]==name)return one[1]; 
        } 
        return false;
    }

    //拋出變量、方法
    window.check_login = check_login;
    window.esay_check_login = esay_check_login;
    window.LOGIN_SUCC = 1;
    window.LOGIN_FAIL = 2;
    window.LOGIN_TIMEOUT = 3;
})();

 

調用方法ajax

check_login(login_user_id,session_id,function(status){

if(status == LOGIN_SUCC){
//xxx
}else if(status == LOGIN_FAIL){
//xxx
}else if(status == LOGIN_TIMEOUT){
//xxx
}

});
相關文章
相關標籤/搜索