我在做項目時有時會遇到session超時問題,如果session超時,平常請求沒有什麼問題,通過攔截器可以正確跳到登陸頁面,可是你如果用ajax請求的話這就出現問題了,因爲ajax是異步的,局部刷新,所以登陸界面不會再全頁面中顯示,他只會顯示到頁面的一部分當中。所以根據我這幾年的經驗(突出工作經驗)|(根據我在網上找到的一些資料(突出學習能力)),找到了我認爲比較好的一種方法。
因爲那我用的框架是和struts2集成的 所以就在攔截器中進行設置,
1. 首先判斷session是否爲空就是判斷session是否超時,
2. 如果超時就取出請求的head頭信息request.getHeader("x-requested-with")
如果不爲空就和XMLHttpRequest (Ajax標識)進行比較 (request.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest"))) 如果相等就說明次請求是ajax請求。
3. 如果是ajax請求就可以
response.setHeader("鍵","值");設置一個標識來告訴用戶這次是ajax請求並且session超時時發出的,
4. 這樣那我可以在回調函數中取出自己設置的那個唯一標識
XMLHttpRequest.getResponseHeader(""); 如果取出的值是和自己在後臺中設置的值一樣的話,就證明session已經超時,這樣就可以設置window.location.replace("登陸界面"); 來跳轉到登陸界面了。
這樣做雖然解決了問題,但是,這樣做就會在每個回調函數中寫入那些代碼,這樣的話代碼就會顯得特別零散,所以呢就想能不能定義一個全局的設置所以就找到了jqery的ajaxSetUp方法 通過ajaxSetUp對jqery的ajax進行全局的判斷
(ajaxSetUp就相當於ajax的攔截器),通過設置ajaxSetUp裏的complete 它就相當於回調函數,這樣那就彌補了上一方法的不足。
我做項目時還用到
$(document).ajaxStart();
這是ajax請求時的事件
$(document).ajaxSuccess(),
這是AJAX 請求成功後的事件
我一般用他們來顯示遮罩層和隱藏遮罩層用的加遮罩層是爲了不讓用戶重複提交,更提高了用戶體驗度,讓用戶知道已經提交了