1. 程式人生 > >Ajax請求Session超時問題

Ajax請求Session超時問題

       我在做專案時有時會遇到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 請求成功後的事件

 我一般用他們來顯示遮罩層和隱藏遮罩層用的加遮罩層是為了不讓使用者重複提交,更提高了使用者體驗度,讓使用者知道已經提交了