使用struts2處理普通http請求和ajax請求的對比

</pre>最近在嘗試寫一個簡單的博客,用到了struts2框架。自己寫了一個登錄攔截器,繼承自struts2的MethodFilterInterceptor,用來限制當前用戶的一些操作,在用戶進行寫操作時(評論、寫博客等),先讓用戶登錄,即跳轉到登錄界面。之所以繼承這個攔截器,因爲這個攔截器可以靈活配置一些不需要攔截的方法(瀏覽博客等)。之前普通的action被登錄攔截器攔截時,如果未登錄,直接返回 “login” 字符串,在struts2的配置文件中爲這個字符串配置了對應的登錄頁面,然後即可自動跳轉到登錄界面。可是,我在程序中有些操作使用了 ajax 方式提交請求(收藏博客、刪除收藏、關注、取消關注等),於是在攔截器中檢測到用戶未登錄時,如果只返回簡單的“login”字符串,那麼程序不會自動跳轉到登錄頁面,因爲ajax是異步更新網頁,而不是傳統的刷新整個網頁。ajax對返回的內容都解析爲普通的字符串,因此無法自動跳轉登錄界面。正確的做法是在攔截器中檢測,如果發現是ajax請求,就進行單獨處理。以下代碼即用來檢測是否是ajax請求:</p><p><span style="font-size:18px;"></span><pre name="code" class="java">request.getHeader("X-Requested-With") != null 
		&& request.getHeader("X-Requested-With").equalsIgnoreCase("XMLHttpRequest")
如果是ajax請求,而且用戶未登錄,就在攔截器中使用response對象向前端頁面寫一個未登錄的標識(“isNotLogin”),然後在頁面上獲取這個返回結果,直接使用js的window.location="";重定向到登錄頁面即可。代碼如下:

//如果是ajax請求
if(request.getHeader("X-Requested-With") != null 
<span style="white-space:pre">		</span>&& request.getHeader("X-Requested-With").equalsIgnoreCase("XMLHttpRequest")){
			PrintWriter out = response.getWriter();
			out.print("isNotLogin");//返回一個標識給前端
			out.flush();
			out.close();
			return null;
}

頁面上的js代碼爲:

//使用jQuery.ajaxSetup() 方法設置全局 AJAX 默認選項,捕獲剛剛在攔截器裏傳遞的值
		$.ajaxSetup({  
		    cache: false, //關閉ajax緩存
		    contentType:"application/x-www-form-urlencoded;charset=utf-8",   
		    //complete:表示完成請求後觸發。
		    //即在success或error觸發後觸發
		    //XHR:XMLHttpReques
		    complete:function(XHR,textStatus){ 
		    	var resText = XHR.responseText; 
		    
		    	//isNotLogin標識用戶當前未登錄,需要將頁面轉到登錄頁面
		        if(resText=='isNotLogin'){ 
		        	window.location="LoginAction_toLoginPage";
		        }
		    }   
		}); 

這樣就可以正確的處理ajax請求了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章