重寫ajax方法實現異步請求session過期時跳轉登錄頁面


一般我們會在過濾器里推斷登錄狀態,假設沒登錄就跳轉登錄頁面。過濾器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請求之前運行。




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM