最近由于一个项目,模块切换为ajax请求数据,当Session失效后,ajax请求后没有返回值,这时候应该要求系统重新登录才可以。
现在Ajax在Web项目中应用广泛,几乎可以说无处不在,这就带来另外一个问题:当Ajax请求遇到Session超时,应该怎么办?
显而易见,传统的页面跳转在此已经不适用,因为Ajax请求是XMLHTTPRequest对象发起的而不是浏览器,在验证失败后的页面跳转无法反应到浏览器中,因为服务器返回(或输出)的信息被JavaScript(XMLHTTPRequest对象)接到了。
那么应该怎么处理这种情况呢?
解决方法:
既然服务器返回的消息被XMLHTTPRequest对象接收,而XMLHTTPRequest对象又是在JavaScript的掌控之中,那么我们是否可以利用JavaScript来完成页面跳转呢?
当然可以,而且很容易实现!但有一点,我们需要判断一下HTTP请求是否为Ajax请求(因为AJAX请求和普通的请求需要分开处理),这又如何判断呢?其实Ajax请求和普通的HTTP请求是不同的,这体现在HTTP请求的头信息中,如下所示:
上面两张图片是用火狐的Firebug截取的,前者是普通的HTTP请求头信息;后者为Ajax请求的请求头信息。注意第一图片被红框圈起来的部分,这就是Ajax请求与普通请求不同的地方,AJAX请求头中带有X-Requested-With信息,其值为XMLHttpRequest,这正是我们可以利用的地方。
所以.......
第一步,在spring拦截器中做好请求session处理
String requestType = request.getHeader("X-Requested-With"); //判断是否登录,未登录返回登录页面 if(!SessionUtil.adminOnLogin(request)){ if(StringUtil.isNotEmpty(requestType) && requestType.equalsIgnoreCase("XMLHttpRequest")){ //session失效的时候,在返回里面自定义一个变量,以便在ajax请求的时候做处理 response.setHeader("sessionstatus", "timeout"); response.sendError(403, "session timeout."); //response.sendError(, "session timeout."); }else{ response.sendRedirect(request.getContextPath()+"/manager/admin/login"); } return false; }else{ return true; }
第二步,重写ajax请求
var isTip = false;//防止一个页面多个ajax请求,重复跳出弹框 jQuery(function($){ // 备份jquery的ajax方法 var _ajax=$.ajax; // 重写ajax方法,先判断登录在执行success函数 $.ajax=function(opt){ var _complete = opt && opt.complete || function(a, b){}; var _error = opt && opt.error || function(a, b){}; var _opt = $.extend(opt, { complete: function(xhr,status){ _complete(xhr,status); } , error: function(xhr,status){ //通过XMLHttpRequest取得响应头,sessionstatus var sessionstatus=xhr.getResponseHeader("sessionstatus"); if(sessionstatus == 'timeout'){// if(isTip == false){ alert("由于你长时间没有操作,需要重新登录!"); window.location.href = "${pageContext.request.contextPath}/manager/admin/login"; isTip = true; } }else{ } _error(xhr,status); } }); _ajax(_opt); }; });
后面在在页面中正常使用ajax就会自动判断session是否已经失效,并在失效的时候自动的跳转到登录页面。
相关推荐
最近由于一个项目,模块切换为ajax请求数据,当Session失效后,ajax请求后没有返回值,只有响应的html:<html>[removed]window.open(‘http://192.168.0.118:8080/welcomeAction/loginUI.do’,’_top’);...
最近由于一个项目,模块切换为ajax请求数据,当Session失效后,ajax请求后没有返回值,只有响应的html: <html> [removed]window.open('http://192.168.0.118:8080/welcomeAction/loginUI.do','_top'); ...
HTML + Servlet + Filter + jQuery 一般来说我们的项目都有登录过滤器,一般请求足以搞定。但是AJAX却是例外的,所以解决方法是设置响应为session失效。
在使用spingMVC的拦截器来处理用户session失效的问题时,当用户session失效会返回一串javascript字符串强制用户浏览器跳转至登录页面。然而当使用Ajax请求数据时,在验证失败后只会响应一串字符串,JavaScript并不会...
主要介绍了Ajax Session失效跳转登录页面的方法,非常不错具有参考借鉴价值,感兴趣的朋友一起看下吧
在线人员 ajax聊天室 关闭浏览器和登出控制使session失效 功能基本完成。 可以查看我的博客。 直接下载即可运行。
最近在研究有关.net mvc项目中的session失效问题,下面小编把研究过程给大家共享下,大家可以参考下。 最近解决基于.net mvc项目的session失效问题,这个跟大家聊聊。 1.问题分析 .net mvc中,Session失效需要考虑...
使用filter来做后台,Ext.Ajax.on('requestcomplete', checkUserSessionStatus, this);用requestcomplete这个方法来异步判断session是否已经失效了
下面小编就为大家带来一篇ajax 操作全局监测,用户session失效的解决方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
何为跨域跨域session/cookie? 也就是第三方session/cookie。第一方session/cookie指的是访客当前访问的网站给访客的浏览器设置的seesion /cookie, 会被存储在访客的计算机上。第三方session/cookie指的是当前访问的...
主要给大家介绍了关于express如何解决ajax跨域访问session失效问题的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
主要介绍了前后端分离 vue+springboot 跨域 session+cookie失效问题的解决方法,解决过程也很简单 ,需要的朋友可以参考下
主要介绍了Ajax访问不断变化的session的值不一致解决方法以及HTTP协议中的GET、POST的区别的相关资料,需要的朋友可以参考下