项目要添加过滤未登录用户跳转到登录页面,对于普通页面来说response.sendRedirect("/login.action"); 完全没问题,但是在使用ajax的时候往往得不到想要的效果。因为页面根本没跳转,只是捕获到了登录页面的源码而已。
现在Ajax在Web项目中应用广泛,几乎可以说无处不在,当Ajax请求遇到Session超时,应该怎么办?
显而易见,传统的页面跳转在此已经不适用,因为Ajax请求是XMLHTTPRequest对象发起的而不是浏览器,在验证失败后的页面跳转无法反应到浏览器中,因为服务器返回(或输出)的信息被JavaScript(XMLHTTPRequest对象)接到了。
那么应该怎么处理这种情况呢?
方法
既然服务器返回的消息被XMLHTTPRequest对象接收,而XMLHTTPRequest对象又是在JavaScript的掌控之中,那么我们是否可以利用JavaScript来完成页面跳转呢?
当然可以,而且很容易实现!但有一点,我们需要判断一下HTTP请求是否为Ajax请求(因为AJAX请求和普通的请求需要分开处理),这又如何判断呢?其实Ajax请求和普通的HTTP请求是不同的,这体现在HTTP请求的头信息中,AJAX请求头中带有X-Requested-With信息,其值为XMLHttpRequest,这正是我们可以利用的地方。
Java过滤器代码
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)throws ServletException, IOException { HttpServletRequest request = (HttpServletRequest)servletRequest; HttpServletResponse response = (HttpServletResponse)servletResponse; String urlParameter = request.getQueryString(); String urlParam = ""; if (urlParameter!=null) { String[] array = urlParameter.split("="); if (array.length>1) { urlParam = array[1]; if(urlParam.split("&").length>1){ urlParam = urlParam.split("&")[0]; } } }else { // 对于错误的url及直接输入jsp的url urlParam默认为“” } HttpSession session = request.getSession(false); if("index".equals(urlParam) || "login".equals(urlParam)){ //这里表示如果当前页面是登陆入口页面或登录页面,跳转到登陆页面 filterChain.doFilter(request, response); return; }else { //在不为登陆页面时,再进行判断,如果不是登陆页面也没有session则跳转到登录页面 if(session == null || session.getAttribute("loginUser") == null){ log.info("filter>>登录超时..."); if (request.getHeader("x-requested-with") != null && request.getHeader("x-requested-with").equals("XMLHttpRequest")) { // ajax请求 response.setHeader("sessionstatus", "timeout"); } else { response.sendRedirect(logout_page); return; } }else{ //这里表示正确,会去寻找下一个链,如果不存在,则进行正常的页面跳转 filterChain.doFilter(request, response); return; } }
Javascript代码
$.ajaxSetup方法是来设置AJAX请求默认选项的,我们可以认为是全局的选项设置,因此可以将这段代码提到外部JS文件中,在需要的页面引用。
本人遇到这个全局设置有时能用有时不能用的问题,原因就是在相应页面没有把存放此方法的.js文件引进来,很无语,浪费了我很长时间找原因!
新建一个.js文件内容如下
/** * 设置未来(全局)的AJAX请求默认选项 * 主要设置了AJAX请求遇到Session过期的情况 */ $.ajaxSetup({ complete: function(xhr,status) { var sessionStatus = xhr.getResponseHeader('sessionstatus'); if(sessionStatus == 'timeout') { var top = getTopWinow(); var yes = confirm('由于您长时间没有操作, session已过期, 请重新登录.'); if (yes) { top.location.href = 'elecmgServlet?type=index'; } } } }); /** * 在页面中任何嵌套层次的窗口中获取顶层窗口 * @return 当前页面的顶层窗口对象 */ function getTopWinow(){ var p = window; while(p != p.parent){ p = p.parent; } return p; }
原文:http://www.cnblogs.com/qixing/p/3679991.html
相关推荐
现在Ajax在Web项目中应用广泛,几乎可以说无处不在,这就带来另外一个问题:当Ajax请求遇到Session超时,应该怎么办? 显而易见,传统的页面跳转在此已经不适用,因为Ajax请求是XMLHTTPRequest对象发起的而不
AJAX 开发简略 <br>一、AJAX 定义 <br>二、现状与需要解决的问题 <br>三、为什么使用AJAX<br>四、谁在使用AJAX<br>五、用AJAX 改进你的设计 <br>例子1 :数据校验<br> <br><br>相关文章:<br><br>例子2 :按需取数据...
ASP.NET与AJAX深度剖析范例集 的随书代码<br>书的目录如下:<br>目录<br>第1章 构建自己的网站<br>第2章 Visual Studio 2005的重要改变<br>第3章 ASP.NET 2.0新功能剖析<br>第4章 数据库访问机制的重大变革<br>第5章...
ASP.NET与AJAX深度剖析范例集 的随书代码<br>书的目录如下:<br>目录<br>第1章 构建自己的网站<br>第2章 Visual Studio 2005的重要改变<br>第3章 ASP.NET 2.0新功能剖析<br>第4章 数据库访问机制的重大变革<br>第5章...
1. AJAX介绍<br>AJAX是一种运用JavaScript和可扩展标记语言(XML),在网络浏览器和服务器之间传送或接受数据的技术。<br><br>2. AJAX实例<br>AJAX可以用来创建更多交互式的网络应用程序。<br><br>3. AJAX源代码<br>...
1、附含Ajax应用:<br><br> 用户名是否存在,<br><br> 是否符合标准检验;<br><br> 2、附带邮件地址检查、<br><br> 用户名检查、<br><br> 用户密码输入检查<br><br> 多...<br><br> 6、适合Ajax初学者参考使用;<br>
环境 <br><br>Eclipse 6.5<br><br>jdk1.6<br><br>tomcat 6.0<br><br>Ajax <br><br><br><br>------------------<br>author:sunflower<br>QQ:527067272<br><br>SSH技术交流群<br>Software①China:25891402<br>Software...
Ajax 对象 5<br>3.1. 使用 Ajax.Request类 5<br>3.2. 使用 Ajax.Updater 类 7<br>4. prototype.js参考 9<br>4.1. JavaScript 类的扩展 9<br>4.2. 对 Object 类的扩展 9<br>4.3. 对 Number 类的扩展 9<br>4.4. 对 ...
Prototype<br>Ajax聊天室<br>ajax实时更新天气预报<br>Ajax示例-简单会员注册 v1.0<br>asp.net%2Bajax实现无刷新聊天室<br>ASPNETCHAT<br>chat2.0<br>login<br>login form using ajax<br>UChat<br>YangFanPC<br>...
原书附带光盘文件<br>第2章<br> 02/ 基于Ajax的留言板示例<br>第3章<br> 03/3.1.3.html JavaScript在Ajax中的作用范例<br> 03/3.4.6.html 加入注释,实现九九乘法表<br> 03/3.4.11.html 使用逻辑表达式...
第一章 绪论 1<br>1.1 系统开发背景 1<br>1.2课题研究的意义 1<br>第二章 Blog系统开发技术 2<br>2.1 ASP.NET介绍 2<br>2.2 MVC开发模式 3<br>2.3Ajax介绍 4<br>2.3.1什么是Ajax 4<br>2.3.2 Ajax相关技术介绍 4<br>...
不过用之前最<br>好把迅雷关掉,它默认的服务端口是80,<br><br>把此服务器端和两个网页文件解压到同一个文件夹中,<br>并运行此服务器程序,访问:<br>http://127.0.0.1/test.html<br><br>不出什么问题的话,您现在...
在web.config中设置httpHandleer标签<br> <configuration><br> <system.web><br> <httpHandlers><br> <add verb="POST,GET" path="ajax/*.ashx" type="Ajax.PageHandlerFactory,Ajax" /><br> </httpHandlers><br> </...
<br><br>Application sessions <br><br> <br><br>Session information and attributes <br><br> <br><br>Context attributes <br><br> <br><br>Application resources <br><br> <br><br>Application JSP files <br>...
三层个人网站小程序(Ajax)<br>Ajax三层个人网站小程序 <br><br>DAL——数据层 <br>IDAL——数据接口层(控制是选择什么类型的数据库) <br>Bll——逻辑层 <br>Model——构造模型(对应数据库字段) <br><br>功能很...
将数据加入到模板中 62<br>下一步 63<br>学习利用模板(Templates)的...器函数 66<br>方法共享 66<br>表单组件入门 67<br>表单体 67<br>创建表单字段 67<br>完成表单 68<br>下一步 69<br>为一个表单填充或提交数据 ...
新建项目,加载该文件<br>数据库是用的 51aspx的数据库(含全国完整省市区的数据)<br>App_data下的my51aspx.mdf为Sql数据库文件,在数据库中附加即可<br>根据自身SQL修改web.config文件<br>第2个 ajax例子 3联动+无...
这个软件现在市面上只有2.0 和2.1<br>2,0有些新东西不能用<br>2.1要钱才能用啊,<br><br>怕这个东西以后2.02没有了先发个到csdn保存一下,<br><br>听说网友想在2.02上开发出网友自己的2.1这个目前不敢肯定,但是官方的...