在spring security 中 Ajax提交時(shí),session超時(shí),局部加載登陸頁面,為解決這個(gè)問題,重寫ajax提交,返回的是modeview或者沒有制定datatype時(shí);
如果檢測到加載到了login頁面,則直接整體跳轉(zhuǎn)到登陸頁面,
具體代碼如下:
(function($){ // 保存原有的jquery ajax; var $_ajax = $.ajax; $.ajax = function(options){ var originalSuccess, mySuccess, success_context; if (options.success && options.dataType!="json") { //如果返回的是json或者map則,下文中的data.indexof函數(shù)出錯(cuò); // save reference to original success callback originalSuccess = options.success; success_context = options.context ? options.context : $; // 自定義callback mySuccess = function(data) {
if(xhr.responseText.indexOf("<body name=\"loginPage\"") >= 0){
//如果擔(dān)心登陸后,跳轉(zhuǎn)到原來的ajax請求頁面,原來的父頁面沒有了,可以在這里設(shè)置跳轉(zhuǎn)到一個(gè)action,登陸成功后,跳到這個(gè)action
window.location.href =window.location.href;//baseURL+"/home/index";
return;
}else{
// call original success callback
originalSuccess.apply(success_context, arguments);
} }; // override success callback with custom implementation options.success = mySuccess; } // call original ajax function with modified arguments $_ajax.apply($, arguments); }; })(jQuery);
如果AJAx返回的是json,則Ajax返回?cái)?shù)據(jù)之前就跳轉(zhuǎn)到了login.jsp頁面;返回的是一個(gè)jsp頁面,轉(zhuǎn)json格式時(shí),直接拋Ajax轉(zhuǎn)換報(bào)錯(cuò)解決方法如下:
$(document).ready(function(){ $.ajaxSetup({ error:function(xhr, textStatus, errorThrown){ if((xhr.status == 0 && this.url)||(textStatus=="parsererror")){//返回的是login.jsp頁面,所以json解析報(bào)錯(cuò) common.showTip({title: localeMsg.common.error, text: '會話超時(shí)請重新登錄'});
//如果擔(dān)心登陸后,跳轉(zhuǎn)到原來的ajax請求頁面,原來的父頁面沒有了,可以在這里設(shè)置跳轉(zhuǎn)到一個(gè)action,登陸成功后,跳到這個(gè)action window.location.href =baseURL+"/login.jsp"; return; //common.genSsoIframe(this.url, function(){ //}); }else{ common.showTip({title: localeMsg.common.error, text: xhr.status}); } } });});
如果AJax提交的是json,則可以在攔截器中,判斷session實(shí)效時(shí),再在ajax中攔截,具體的方法如下:
spring security 3 的Ajax (解決 Ajax登陸頁面跳轉(zhuǎn)) http://jackyrong.iteye.com/blog/1770629