我使用的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 当请求完成之后调用这个函数,无论成功或失败。幸好有这么个可爱的回调函数!!
而$.get()、$.load()、$.post()方式的回调函数都是调用成功返回才会触发的回调函数,所以只能使用如上这种方式!
原理如下:
发送Ajax请求,无论成功或失败,都会调用complete回调函数,所以如果Sessio超时了,complete回调函数中的textStatus的值为===>>请注意红色部分
error,值为error,则可以判断如果为error则使用window.location="你的登录首页"这种方式重定向浏览器。
就这么简单,根本不用什么在服务端写入HttpHeader任何信息,服务端不需要做任何处理,所需要做的仅仅是如上我给出的代码一样,再申明一次,绝对正确,我使用的jquery是1.7.2版本!其它版本没测试过!
如有疑问或者是更好的方式欢迎交流!
更正一点:
由于缓存原因给我造成了错觉,在服务端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!
增加第二种方法:
在页面脚本使用Jquery中的Ajax全局函数ajaxError()方法,直接看代码:
$(document).ajaxError(function(){
fnVerifySession(true);
});
匿名函数里写自己的业务逻辑,fnVerifySession方法是我自己写的用来弹出一个层提示Session超时的。
使用全局函数的前提就是一定要使这3行代码是全局的,即每个页面都能访问到,建议写到外部js文件,然后在每个页面包含
对于服务端的处理依旧和上面一样,返回错误响应码
分享到:
相关推荐
Ajax请求session超时处理流程 java服务器端处理: SessionValidateFilter中修改: if (ServerInfo.isAjax(request)) { request.setAttribute("statusCode", 301); request.setAttribute("message", "Session ...
现在Ajax在Web项目中应用广泛,几乎可以说无处不在,这就带来另外一个问题:当Ajax请求遇到Session超时,应该怎么办? 显而易见,传统的页面跳转在此已经不适用,因为Ajax请求是XMLHTTPRequest对象发起的而不
主要介绍了为jquery的ajax请求添加超时timeout时间的操作方法,文中通过一段简单的代码给大家介绍jquery ajax超时设置方法,感兴趣的朋友跟随脚本之家小编一起看看吧
今天发现,当使用Ajax请求时,如果后台进行重定向到其他页面时是无法成功的,只能在浏览器地址栏输入才能够实现重定向。 Ajax默认就是不支持重定向的,它是局部刷新,不重新加载页面。 需要实现的功能是,后台网关...
利用HttpSession实现Ajax请求重定向
下面小编就为大家带来一篇Web 开发中Ajax的Session 超时处理方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
本文由脚本之家小编跟大家分享的ajax请求Session失效问题,感兴趣的朋友一起看看吧
主要介绍了重写 ajax 实现 session 超时跳转到登录页面实例代码,需要的朋友可以参考下
Android Webview虽然提供了页面加载及资源请求的钩子,但是对于h5的ajax请求并没有提供干涉的接口,这意味着我们不能在webview中干涉javascript发起的http请求,而有时候我们确实需要能够截获ajax请求并实现一些功能...
jquery中ajax方法有个属性async用于控制同步和异步,默认是true,即ajax请求默认是异步请求,有时项目中会用到AJAX同步。这个同步的意思是当JS代码加载到当前AJAX的时候会把页面里所有的代码停止加载,页面出现
SpringMVC 框架在处理 Ajax 请求时需要注意一些重要的配置和设置,以确保请求的正确处理和数据的正确传输。下面我们将介绍在 SpringMVC 中接收 Ajax 请求的注意事项。 基本数据类型参数传输 在 Ajax 请求中,如果...
Js 拦截全局ajax请求
NULL 博文链接:https://ait.iteye.com/blog/1867548
如果session超时,而且是ajax请求,就会在响应头里。再用一个全局的方法来处理,session超时要跳转的页面
HTML + Servlet + Filter + jQuery 一般来说我们的项目都有登录过滤器,一般请求足以搞定。但是AJAX却是例外的,所以解决方法是设置响应为session失效。
Spring Boot 使用 Redis 进行配置 Session 共享(Ajax 跨域) 源码下载。
在进行Ajax调用过程中一般都具有这样的做法:显示一个GIF图片动画表明后台正在工作,同时阻止用户操作本页面(比如Ajax请求通过某个按钮触发,用户不能频繁点击该按钮产生多个并发Ajax请求);调用完成后,图片消失...