`

<转>过滤器面对ajax访问遇到Session失效问题

阅读更多
       项目要添加过滤未登录用户跳转到登录页面,对于普通页面来说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访问遇到Session失效的问题

    现在Ajax在Web项目中应用广泛,几乎可以说无处不在,这就带来另外一个问题:当Ajax请求遇到Session超时,应该怎么办? 显而易见,传统的页面跳转在此已经不适用,因为Ajax请求是XMLHTTPRequest对象发起的而不

    AJAX开发简略

    AJAX 开发简略 &lt;br&gt;一、AJAX 定义 &lt;br&gt;二、现状与需要解决的问题 &lt;br&gt;三、为什么使用AJAX&lt;br&gt;四、谁在使用AJAX&lt;br&gt;五、用AJAX 改进你的设计 &lt;br&gt;例子1 :数据校验&lt;br&gt; &lt;br&gt;&lt;br&gt;相关文章:&lt;br&gt;&lt;br&gt;例子2 :按需取数据...

    ASP.NET与AJAX深度剖析范例集_卷2(源代码)

    ASP.NET与AJAX深度剖析范例集 的随书代码&lt;br&gt;书的目录如下:&lt;br&gt;目录&lt;br&gt;第1章 构建自己的网站&lt;br&gt;第2章 Visual Studio 2005的重要改变&lt;br&gt;第3章 ASP.NET 2.0新功能剖析&lt;br&gt;第4章 数据库访问机制的重大变革&lt;br&gt;第5章...

    ASP. NET与AJAX深度剖析范例集_卷1(共2卷)(源代码)

    ASP.NET与AJAX深度剖析范例集 的随书代码&lt;br&gt;书的目录如下:&lt;br&gt;目录&lt;br&gt;第1章 构建自己的网站&lt;br&gt;第2章 Visual Studio 2005的重要改变&lt;br&gt;第3章 ASP.NET 2.0新功能剖析&lt;br&gt;第4章 数据库访问机制的重大变革&lt;br&gt;第5章...

    Ajax中文手册(快速上手)

    1. AJAX介绍&lt;br&gt;AJAX是一种运用JavaScript和可扩展标记语言(XML),在网络浏览器和服务器之间传送或接受数据的技术。&lt;br&gt;&lt;br&gt;2. AJAX实例&lt;br&gt;AJAX可以用来创建更多交互式的网络应用程序。&lt;br&gt;&lt;br&gt;3. AJAX源代码&lt;br&gt;...

    AJAX简单会员注册

    1、附含Ajax应用:&lt;br&gt;&lt;br&gt; 用户名是否存在,&lt;br&gt;&lt;br&gt; 是否符合标准检验;&lt;br&gt;&lt;br&gt; 2、附带邮件地址检查、&lt;br&gt;&lt;br&gt; 用户名检查、&lt;br&gt;&lt;br&gt; 用户密码输入检查&lt;br&gt;&lt;br&gt; 多...&lt;br&gt;&lt;br&gt; 6、适合Ajax初学者参考使用;&lt;br&gt;

    ajax 模拟聊天

    环境 &lt;br&gt;&lt;br&gt;Eclipse 6.5&lt;br&gt;&lt;br&gt;jdk1.6&lt;br&gt;&lt;br&gt;tomcat 6.0&lt;br&gt;&lt;br&gt;Ajax &lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;------------------&lt;br&gt;author:sunflower&lt;br&gt;QQ:527067272&lt;br&gt;&lt;br&gt;SSH技术交流群&lt;br&gt;Software①China:25891402&lt;br&gt;Software...

    Prototype学习笔记(最新整理)

    Ajax 对象 5&lt;br&gt;3.1. 使用 Ajax.Request类 5&lt;br&gt;3.2. 使用 Ajax.Updater 类 7&lt;br&gt;4. prototype.js参考 9&lt;br&gt;4.1. JavaScript 类的扩展 9&lt;br&gt;4.2. 对 Object 类的扩展 9&lt;br&gt;4.3. 对 Number 类的扩展 9&lt;br&gt;4.4. 对 ...

    Aib06Soft_Ericajax大全

    Prototype&lt;br&gt;Ajax聊天室&lt;br&gt;ajax实时更新天气预报&lt;br&gt;Ajax示例-简单会员注册 v1.0&lt;br&gt;asp.net%2Bajax实现无刷新聊天室&lt;br&gt;ASPNETCHAT&lt;br&gt;chat2.0&lt;br&gt;login&lt;br&gt;login form using ajax&lt;br&gt;UChat&lt;br&gt;YangFanPC&lt;br&gt;...

    AJAX 源码范例

    原书附带光盘文件&lt;br&gt;第2章&lt;br&gt; 02/ 基于Ajax的留言板示例&lt;br&gt;第3章&lt;br&gt; 03/3.1.3.html JavaScript在Ajax中的作用范例&lt;br&gt; 03/3.4.6.html 加入注释,实现九九乘法表&lt;br&gt; 03/3.4.11.html 使用逻辑表达式...

    Blog系统实现毕业论文

    第一章 绪论 1&lt;br&gt;1.1 系统开发背景 1&lt;br&gt;1.2课题研究的意义 1&lt;br&gt;第二章 Blog系统开发技术 2&lt;br&gt;2.1 ASP.NET介绍 2&lt;br&gt;2.2 MVC开发模式 3&lt;br&gt;2.3Ajax介绍 4&lt;br&gt;2.3.1什么是Ajax 4&lt;br&gt;2.3.2 Ajax相关技术介绍 4&lt;br&gt;...

    最简单的AJAX的GET方式的实现 例子

    不过用之前最&lt;br&gt;好把迅雷关掉,它默认的服务端口是80,&lt;br&gt;&lt;br&gt;把此服务器端和两个网页文件解压到同一个文件夹中,&lt;br&gt;并运行此服务器程序,访问:&lt;br&gt;http://127.0.0.1/test.html&lt;br&gt;&lt;br&gt;不出什么问题的话,您现在...

    Ajax for asp.net

    在web.config中设置httpHandleer标签&lt;br&gt; &lt;configuration&gt;&lt;br&gt; &lt;system.web&gt;&lt;br&gt; &lt;httpHandlers&gt;&lt;br&gt; &lt;add verb="POST,GET" path="ajax/*.ashx" type="Ajax.PageHandlerFactory,Ajax" /&gt;&lt;br&gt; &lt;/httpHandlers&gt;&lt;br&gt; &lt;/...

    LambdaProbe 中文包下载

    &lt;br&gt;&lt;br&gt;Application sessions &lt;br&gt;&lt;br&gt; &lt;br&gt;&lt;br&gt;Session information and attributes &lt;br&gt;&lt;br&gt; &lt;br&gt;&lt;br&gt;Context attributes &lt;br&gt;&lt;br&gt; &lt;br&gt;&lt;br&gt;Application resources &lt;br&gt;&lt;br&gt; &lt;br&gt;&lt;br&gt;Application JSP files &lt;br&gt;...

    三层个人网站小程序(Ajax源码)

    三层个人网站小程序(Ajax)&lt;br&gt;Ajax三层个人网站小程序 &lt;br&gt;&lt;br&gt;DAL——数据层 &lt;br&gt;IDAL——数据接口层(控制是选择什么类型的数据库) &lt;br&gt;Bll——逻辑层 &lt;br&gt;Model——构造模型(对应数据库字段) &lt;br&gt;&lt;br&gt;功能很...

    EXT 中文帮助手册

    将数据加入到模板中 62&lt;br&gt;下一步 63&lt;br&gt;学习利用模板(Templates)的...器函数 66&lt;br&gt;方法共享 66&lt;br&gt;表单组件入门 67&lt;br&gt;表单体 67&lt;br&gt;创建表单字段 67&lt;br&gt;完成表单 68&lt;br&gt;下一步 69&lt;br&gt;为一个表单填充或提交数据 ...

    Ajax三级联动和无刷新分页源码

    新建项目,加载该文件&lt;br&gt;数据库是用的 51aspx的数据库(含全国完整省市区的数据)&lt;br&gt;App_data下的my51aspx.mdf为Sql数据库文件,在数据库中附加即可&lt;br&gt;根据自身SQL修改web.config文件&lt;br&gt;第2个 ajax例子 3联动+无...

    不懂ajax一样做ajax extjs2.02

    这个软件现在市面上只有2.0 和2.1&lt;br&gt;2,0有些新东西不能用&lt;br&gt;2.1要钱才能用啊,&lt;br&gt;&lt;br&gt;怕这个东西以后2.02没有了先发个到csdn保存一下,&lt;br&gt;&lt;br&gt;听说网友想在2.02上开发出网友自己的2.1这个目前不敢肯定,但是官方的...

Global site tag (gtag.js) - Google Analytics