Ajax请求Session超时时重定向解决方案

我使用的Struts2.3.4,配置的LoginInterceptr拦截器,所有请求除了登录请求外都会先经过拦截器,在拦截器里获取Session信息,判断用户信息是否存在,因为如果Session超时,Session中的信息是会被清除掉的。

所以如果Session已超时,对于非Ajax请求,会直接重定向到登录页面,但是对于Ajax请求则不会,这里给出解决方案,经过测试,绝对可行!当然,如果谁有更好的方法请贴出来:

如果想要Ajax请求在当Session超时的时候也重定向,则需要服务端返回错误信息,在ajax回调函数中做判断,看了看Jquery文档,说是可以定义全局函数,但是不知道那玩意怎么用,试了半天都没试出来!所以只得用如下方法来发Ajax请求:
	function show_userList(){
$.ajax({
type: "GET",
url: "ms/user!userList.action?dd="+new Date().getTime(),
success: function(msg){
$("#bd").html(msg);
},
complete:function(XMLHttpRequest,textStatus){
if(textStatus=="error"){
var ll = "<%=basePath%>";
alert("basePath : "+ll);
window.location=ll+"/login";
}
}
});
}


Jquery文档中如是说:complete 当请求完成之后调用这个函数,无论成功或失败。幸好有这么个可爱的回调函数!! :D 而$.get()、$.load()、$.post()方式的回调函数都是调用成功返回才会触发的回调函数,所以只能使用如上这种方式!

原理如下:
发送Ajax请求,无论成功或失败,都会调用complete回调函数,所以如果Sessio超时了,complete回调函数中的textStatus的值为===>>请注意红色部分[color=red]error[/color],值为error,则可以判断如果为error则使用window.location="你的登录首页"这种方式重定向浏览器。


就这么简单,根本不用什么在服务端写入HttpHeader任何信息,服务端不需要做任何处理,所需要做的仅仅是如上我给出的代码一样,再申明一次,绝对正确,我使用的jquery是1.7.2版本!其它版本没测试过!

如有疑问或者是更好的方式欢迎交流!

[color=silver]更正一点[/color]:
由于缓存原因给我造成了错觉,在服务端struts的拦截器里response中加一个状态标识,类似如下,这是我的loginInterceptor
	@Override
public String intercept(ActionInvocation invocation) throws Exception {

LoginInfoVO login = (LoginInfoVO)ServletActionContext.getRequest().getSession().getAttribute("login");

//如果为空,则返回到登录页面
if(login == null){
ServletActionContext.getResponse().setStatus(HttpServletResponse.SC_FORBIDDEN);
return "login";
}

//继续向下执行
return invocation.invoke();
}


ajax的textStatus经测试只有两种状态成功为“success”,失败为“error”;所以如果在response中设置http错误状态码就OK!

[color=#3FA54E]增加第二种方法:[/color]
在页面脚本使用Jquery中的Ajax全局函数ajaxError()方法,直接看代码:
$(document).ajaxError(function(){
fnVerifySession(true);
});

匿名函数里写自己的业务逻辑,fnVerifySession方法是我自己写的用来弹出一个层提示Session超时的。
使用全局函数的前提就是一定要使这3行代码是全局的,即每个页面都能访问到,建议写到外部js文件,然后在每个页面包含
对于服务端的处理依旧和上面一样,返回错误响应码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值