前端頁面開發時,常常須要異步校驗登陸態,每次都從新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 } });