`

<转>过滤器面对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请求,由于其异步性质,处理Session失效的方式略有不同。 标题和描述中提到的问题在于,Ajax请求可能不会像普通HTTP请求那样经过完整的过滤器链,因此需要特别处理。以下是如何解决Ajax请求时Session失效...

    详解.net mvc session失效问题

    然而,有时我们可能会遇到Session失效的问题,这可能导致用户体验下降或安全问题。本文将深入探讨这个问题,提供解决方案,并给出具体的实现步骤。 首先,我们需要理解Session失效可能发生在不同类型的请求中,包括...

    解决laravel session失效的问题

    这篇文章讲述了在Laravel 5.2版本中遇到的Session失效问题,并提供了解决方案。首先,文章提到了Laravel不使用传统的`$_SESSION`超全局变量,而是提供了自己的一套Session管理机制。开发者需要通过Laravel提供的...

    解决前后端分离 vue+springboot 跨域 session+cookie失效问题

    在前后端分离的架构中,Vue.js作为前端框架与Spring Boot作为后端服务进行交互时,常常会遇到跨域和Session、Cookie失效的问题。本文将详细介绍如何解决这些问题。 首先,跨域是由于浏览器的安全策略限制,同一源...

    Nginx安装包

    1 &lt;dependency&gt;2 &lt;groupId&gt;org.springframework.session&lt;/groupId&gt;3 &lt;artifactId&gt;spring-session-data-redis&lt;/artifactId&gt;4 &lt;version&gt;1.1.1.RELEASE&lt;/version&gt;5 &lt;type&gt;pom&lt;/type&gt;6 &lt;/dependency&gt; 随后我们在...

    Session过期后自动跳转到登录页面的实例代码

    因此,通常我们会采用过滤器(Filter)的方式来处理Session过期后的跳转。在`web.xml`中,我们需要配置一个名为`sessionFilter`的过滤器,指定对应的Filter类: ```xml &lt;filter&gt; &lt;filter-name&gt;sessionFilter&lt;/...

    重写 ajax 实现 session 超时跳转到登录页面实例代码

    后端过滤器负责检测并处理Session超时,前端通过监听Ajax错误事件,捕获302状态码并模拟页面跳转,确保无论用户是通过常规链接还是Ajax请求,一旦Session超时都能被正确引导到登录页面。这种做法不仅维护了用户操作...

    ajax提交session超时跳转页面使用全局的方法来处理

    如果检测到这是一个AJAX请求,过滤器会在响应头中添加一个自定义字段`sessionstatus`,并将值设为"timeout"。对于非AJAX请求,直接重定向到指定的登录页(例如`/test/index.jsp`)。 接下来,在客户端,我们需要...

    Asp.net 中mvc 实现超时弹窗后跳转功能

    总结来说,Asp.net MVC实现超时弹窗后跳转功能的关键在于自定义授权过滤器,通过检查用户Cookie来判断登录状态,并根据请求类型(普通请求或AJAX请求)返回适当的响应,从而提供良好的用户体验。在实际应用中,还...

    软件架构平台技术重点.doc

    软件架构平台技术是互联网应用开发中的关键组成部分,它涉及到多种技术和概念,如JSP、Servlet、JavaBean、Servlet过滤器、JDBC、数据库连接池、Model 1和MVC架构模式,以及AJAX技术。 首先,Servlet是一种在服务器...

    KODExplorer 芒果云-资源管理器

    - 文件名非法字符限定 &lt;script&gt; - 树目录展开箭头状态修复 - 树目录新建文件,没有子节点刷新bug解决 - 文件大小为0上传不了问题 - windows下进入某些系统文件夹死循环bug解决 - tips 居中显示 - 任务栏标签...

    IT技术文章示例

    映射文件中包含了多个&lt;select&gt;、&lt;update&gt;、&lt;insert&gt;、&lt;delete&gt;等元素,每个元素对应一条SQL语句。通过合理的映射文件配置,可以实现数据库操作与业务逻辑的解耦。 ### 24. Tomcat的Session超时时间设置 Tomcat是一...

    商用版本文本编辑器DotNetTextBoxV6.0.8Source 源码

    2)改良了编辑器回车换行的方式,旧版本按回车后以段落换行(&lt;P&gt;&lt;/P&gt;)的方式现在已更改为&lt;BR&gt;换行,好处是按回车换行后行与行的间距不会过大了(可用新增的NewLineMode属性设置为P恢复为段落换行)! 3)改良了代码状态下...

    javaweb中的笔记

    过滤器在请求到达Servlet之前或之后处理,实现如字符编码转换、权限控制等功能。了解`FilterChain`和`doFilter()`方法。 七、监听器(Listener) 监听器是JavaWeb中的事件处理机制,可以监听ServletContext、...

    Java Web开发实战宝典 第15章 01-09 代码

    15.06可能讲解如何创建、获取和管理session对象,以及处理session过期和失效。 7. **文件上传与下载** (15.07) - 文件上传和下载是Web应用常见功能,15.07可能介绍如何使用Servlet API处理文件上传,以及如何生成...

    Java Web开发实战宝典 第17章 10-18

    本章可能讲述了session对象的创建、管理、失效以及cookie与session的区别和使用场景。 17.14章节可能关注了过滤器(Filter)的概念。过滤器是Java Web的一个强大特性,可以在请求被Servlet处理之前或之后执行预处理...

    深入Javaweb项目开发

    同时,会介绍会话的概念,如session对象的创建、设置属性、获取属性和失效,以及如何处理跨页面的数据共享。 5. **第五章:MVC模式与JSP自定义标签** MVC(Model-View-Controller)模式是JavaWeb开发中常用的设计...

    java面试知识

    ### Java面试知识详解 #### 基础篇 ##### JDK常用的包 - **java.lang**:包含所有编程必需的基础类,如String、Math等。 - **java.util**:提供了大量...##### Ajax请求Session超时问题 - **解决方法**: - 设置...

    javaweb学习资料

    过滤器允许在请求到达目标Servlet或JSP之前对其进行拦截和修改,如进行登录验证、字符编码转换等。监听器则监听应用中发生的事件,如会话创建、销毁、请求初始化等,可用于实现特定的业务逻辑或监控。 7. **请求...

Global site tag (gtag.js) - Google Analytics