/** * jquery ajax請求過濾,防止ajax請求重複發送,對ajax發送錯誤時進行統一處理 */ $(function(){ var pendingRequests = {}; // 全部ajax請求的通用前置filter $.ajaxPrefilter(function( options, originalOptions, jqXHR ) { var key = generatePendingRequestKey(options); //請求是否已經存在 if(!pendingRequests[key]){ storePendingRequest(key,jqXHR); }else{ //若是ajax請求已經存在,下一次相同的請求則取消,防止重複請求 jqXHR.abort(); } //ajax請求完成時,從臨時對象中清除請求對應的數據 var complete = options.complete; options.complete = function(jqXHR, textStatus) { //延時1000毫秒刪除請求信息,表示同Key值請求不能在此時間段內重複提交 setTimeout(function(){ delete pendingRequests[jqXHR.pendingRequestKey]; },1000); if ($.isFunction(complete)) { complete.apply(this, arguments); } }; //統一的錯誤處理 var error = options.error; options.error = function(jqXHR, textStatus) { errorHandler(jqXHR, textStatus); if ($.isFunction(error)) { error.apply(this, arguments); } }; }); /** * 當ajax請求發生錯誤時,統一進行攔截處理的方法 */ function errorHandler(jqXHR, textStatus){ switch (jqXHR.status){ case(500): internalError(jqXHR); break; case(403): accessDenied(jqXHR); break; case(408): timeoutError(jqXHR); break; case(404): pageNotFound(jqXHR); break; default: //otherError(jqXHR, textStatus); } } function pageNotFound(jqXHR){ Component.warningMessageBox({ content:"請求訪問的地址或內容不存在!" }); } function accessDenied(jqXHR){ Component.warningMessageBox({ content:"你無權進行此操做或頁面訪問!" }); } function internalError(jqXHR){ Component.warningMessageBox({ content:"服務器存在錯誤,未能正確處理你的請求!" }); } function timeoutError(jqXHR){ window.location.href=contextPath + "/j_spring_security_logout"; } function otherError(jqXHR, textStatus){ Component.warningMessageBox({ content:"未知錯誤,錯誤代碼:" + textStatus }); } /** * 將ajax請求存儲到臨時對象中,用於根據key判斷請求是否已經存在 */ function storePendingRequest(key, jqXHR){ pendingRequests[key] = jqXHR; jqXHR.pendingRequestKey = key; } /** * 根據ajax請求參數構建一個臨時存儲key,此處簡單的使用url做爲key, * 不考慮爲解決請求類型爲get時相同路徑引發的緩存問題,採用隨機碼構建URL的狀況 */ function generatePendingRequestKey(options){ return options.url; } });