欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-21 22:19:07
...
       项目要添加过滤未登录用户跳转到登录页面,对于普通页面来说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 过滤器