標籤:非同步 ajax session jquery
一般我們會在過濾器裡判斷登入狀態,如果沒登入就跳轉登入頁面,過濾器java核心代碼如下:
UserItem loginUser = (UserItem)request.getSession().getAttribute("loginUser");if(loginUser == null) {response.sendRedirect("/login.action");}
這個對於普通頁面來說完全沒問題,但是在使用ajax的時候往往得不到想要的效果。因為頁面根本沒跳轉,只是捕獲到了登入頁面的源碼而已。
網上一堆庸人給出一堆扯蛋的方法,主要有。
1.返回的字串附加登入狀態;(那麼多,你願意改麼,而且前後端都得改,編碼的時候還要總去考慮那個狀態煩不煩)
2.修改http頭資訊;(裝B深沉型)
3.修改jquery源檔案判斷;(勉強算個程式員,但是儘力不去動源,效能問題你還得解壓再壓縮,別人也不一定知道你改過源碼)
我的解決方案跟第三種方法思路接近,重寫ajax方法實現前置處理,代碼如下:
jQuery(function($){ // 備份jquery的ajax方法 var _ajax=$.ajax; // 重寫ajax方法,先判斷登入在執行success函數 $.ajax=function(opt){ var _success = opt && opt.success || function(a, b){}; var _opt = $.extend(opt, { success:function(data, textStatus){ // 如果後台將請求重新導向到了登入頁,則data裡面存放的就是登入頁的源碼,這裡需要找到data是登入頁的證據(標記) if(data.indexOf('weinianjie') != -1) { window.location.href= Globals.ctx + "/login.action"; return; } _success(data, textStatus); } }); _ajax(_opt); };});
在登入頁面的源碼裡面,你隨便找個地方打個標記然後隱藏掉,比如我的標記就是weinianjie。對於$.get和$.post就不用說了吧,這兩個方法都是調用了$.ajax方法的,所以也就自動擷取了前置判斷能力。
大功告成,注意以上擴充需要放在你的所有ajax請求之前執行。