Struts2 在登录拦截器中对ajax请求的处理

前言:

由于ajax请求不像http请求,可以直接进行页面跳转,你返回的所有东西,ajax都只会识别为一个字符串。

之前尝试的方法是在拦截器中返回一个标识给ajax,然后再在每一个ajax请求成功之后根据标识“isNotLogin”进行页面的跳转,但是这样也很麻烦,每一个ajax请求之后,都需要写一句if(returnStr=="isNotLogin"){ window.location.href="xxxxxx" }

查了资料,试了一下ajaxSetup方法,可以给所有的ajax请求设置初始化,个人觉得就类似一个ajax拦截器吧,虽然也需要在每一个需要使用的jsp中进行引用,不过已经方便很多了,减少了重复代码

1.struts.xml

之前贴过,就不再贴了

2.Interception的doIntercept方法中的关键代码

//ajax请求的处理
if (request.getHeader("X-Requested-With") != null && request.getHeader("X-Requested-With").equalsIgnoreCase("XMLHttpRequest"))
{
	PrintWriter out = response.getWriter(); 
	out.print("isNotLogin");//返回一个标识给前端
	out.flush();
	out.close();
	return null;
}

//http请求的处理
else
{
	//直接跳转到登录页面
	return "login";
}

3.写一个单独的js文件,使用jQuery.ajaxSetup() 方法设置全局 AJAX 默认选项,捕获刚刚在拦截器里传递的值

$.ajaxSetup({  
    cache: false, //关闭ajax缓存
    contentType:"application/x-www-form-urlencoded;charset=utf-8",   
    //complete:表示完成请求后触发。即在success或error触发后触发。也有success: 和 error: 等参数,根据需要来
    complete:function(XHR,textStatus){ 
    	var resText = XHR.responseText; 
    	/*根据拦截器传递的标识,进行相关操作*/
    	//isNotLogin标识用户当前未登录,需要将页面转到登录页面
        if(resText=='isNotLogin'){  
        	window.location=basePath+"/web/tologin.html";
        }  
        //isCookieLogin标识当前用户可使用cookie信息进行自动登录
        else if(resText=='isCookieLogin'){   

        }          
    }   
});

20150708补充

由于$.ajaxSetup级别太高,考虑到只是在请求成功后执行此操作,使用ajaxSuccess更符合需要。

!!!一定要注意ajaxSuccess的执行时机-->

ajaxSuccess只会在 

success: function(data) {
……
}

success后的函数内容全部执行完毕后才会触发。

因此假如本来某个ajax请求的预期返回结果是一个json字符串,但是,如果该请求被拦截器拦截掉了,

且拦截器返回了一个"isNotLogin",很明显不是json格式,那么很有可能后面的js就会出错,js出错就会导致程序中断。这种情况目前还没找到一劳永逸的解决办法,能想到的是可以在前台得到返回值之后进行数据格式的判断或者写try-catch,我使用的是第二种,这样子如果js出错了程序还能继续走,走到ajaxSuccess,相应的页面跳转才能成功完成。

公共的js登录拦截器代码如下:

//当页面中所有ajax请求成功时执行下面的代码
$(document).ajaxSuccess(function (event,xhr,settings){
	/*
	event:触发的事件对象
	xhr:XMLHttpRequest对象
	settings:可以获取当前ajax请求中的参数,
	例如setting.url表示请求的url地址,
	可以以此来过滤指定的ajax请求
	*/
	//alert("ajaxSuccess:"+settings.url);
	var resText = xhr.responseText; 
	
	/*根据拦截器传递的标识,进行相关操作 */
	//isNotLogin标识用户当前未登录,需要将页面转到登录页面
    if(resText=="isNotLogin"){  
    	window.location=basePath+"/web/register_toLogin.html";
    }  
    //isCookieLogin标识当前用户可使用cookie信息进行自动登录
    else if(resText=="isCookieLogin"){   

    } 
   
});
 

顺便贴一下几个全局 Ajax 事件处理器的执行顺序:


Struts2 在登录拦截器中对ajax请求的处理
 


Struts2 在登录拦截器中对ajax请求的处理
 

关于ajax请求的详细说明的链接:

http://www.cnblogs.com/heyuquan/archive/2013/05/13/js-jquery-ajax.html

4.将上面的js文件在每一个需要判断是否登录的jsp中进行引用,即可

相关推荐