Extjs中ajax请求当session失效时自动跳转

当session失效时,我们可以通过filter来拦截并重定向到登陆页面,可是请求如果是ajax请求,页面并不会重定向,这是因为ajax返回的是数据,无法返回页面。

ajax异步请求不同于其他请求,其在请求头里包含有X-Requested-With:XMLHttpRequest,看下面两张图的区别。

我们可以在filter中通过它来判断一个请求是不是异步的,如果是,我们可以返回一个sessionstatus,在页面上通过判断sessionstatus的值来判断session是否失效。

第一张是普通请求:

第二张是ajax的

可是,如果每个ajax都这样写,工作量也是很大的。
由于我使用的是Extjs,而Ext的ajax是单例的,这样我们可以单独写一个js文件,在里边写入session超时验证的代码,其他页面只要引入这个js就可以了。

下面看代码,首先是filter:

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class SessionFilter implements Filter {
    public void destroy() {
    }
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;
        HttpSession session = httpRequest.getSession();

        String url = httpRequest.getRequestURI();
        String path = url.substring(url.lastIndexOf("/"));
        if (check(path)&& session.getAttribute("user") == null) {
        	// 拦截ajax
        	if (httpRequest.getHeader("x-requested-with") != null
                     && httpRequest.getHeader("x-requested-with")
                             .equalsIgnoreCase("XMLHttpRequest")) {
                 httpResponse.addHeader("sessionstatus", "timeout");
                 chain.doFilter(request, response);// 不可少,否则请求会出错
            }else {
                String str = "<script language=‘javascript‘>alert(‘会话过期,请重新登录‘);"
                        + "window.top.location.href=index.jsp‘"
                        + "‘;</script>";
                response.setContentType("text/html;charset=UTF-8");// 解决中文乱码
                try {
                    PrintWriter writer = response.getWriter();
                    writer.write(str);
                    writer.flush();
                    writer.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

        } else {
            chain.doFilter(request, response);
        }
    }
    /**
     * 判断该路径是否要拦截:true【是】
     * @param path
     * @return
     */
    public boolean check(String path){
    	if(path.indexOf("login") != -1||path.indexOf("logout") != -1) //不拦截登入登出
    		return false;
    	return true;
    }
    @Override
    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub
    }
}

然后是web.xml中的配置:

<filter>
        <filter-name>sessionFilter</filter-name>
        <filter-class>com.web.helper.session.SessionFilter</filter-class>
</filter>
<filter-mapping>
        <filter-name>sessionFilter</filter-name>
        <url-pattern>/*</url-pattern>
</filter-mapping>

下面是ajax超时验证的代码[ajax_timeout.js],页面引入该js后,每次ajax请求都会调用这段代码

// ajax回调函数处理session过期
Ext.Ajax.on(‘requestcomplete‘,checkUserSessionStatus, this);
function checkUserSessionStatus(conn,response,options){
	var status = response.getResponseHeader("sessionstatus");
    //Ext重新封装了response对象
    if(status=="timeout"){
    	window.location.href="index.jsp";
    }
}

-  - -  - - - - - -  - - - -  - -  - - -  - - - -  - - - -  - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

后来发现如果代码中还是用了form的submit提交进行上传,这个submit的返回值接收不到,这是因为ajax和submit的返回值不同:

我们要做不同的处理:

// ajax回调函数处理session过期
Ext.Ajax.on(‘requestcomplete‘,checkUserSessionStatus, this);
function checkUserSessionStatus(conn,response,options){
	console.info(response);
	console.info(response.status);
	if(response.status==undefined){
		//解决表单提交不响应的问题
	}else{
		var status = response.getResponseHeader("sessionstatus");
		//Ext重新封装了response对象
		if(status=="timeout"){
			window.location.href="index.jsp";
		}
	}
}
时间: 2024-10-10 15:59:12

Extjs中ajax请求当session失效时自动跳转的相关文章

iframe中请求页面而session失效时页面跳转问题

iframe中请求页面而session失效时页面跳转问题 分类: Web2009-12-11 15:01 656人阅读 评论(0) 收藏 举报 sessioniframejsp 有时候做了就忘了,我记得曾经在学校里老师教过这个问题,可一时就是想不起来,不过终于搜到了这么一篇文章,先记下来以便下次再得了遗忘症. 访问相关jsp页面时,往往要先判断用户session是否失效,以便决定是继续业务,还是跳转到登录页面.这个事情我们通常是用过滤器来实现的.由过滤器判断session是否失效,由此来决定请求

html页面通过ajax请求获取session中的值

在利用springboot进行web开发时,遇到这样一个问题:html如何获取session中的值,实现用户登录系统后首页展示xx欢迎您. 也就是需要实现html通过ajax请求获取session中的值. 1.登录页面 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <meta charset="utf-8"> <meta http-equiv=&quo

ajax访问遇到Session失效问题

最近由于一个项目,模块切换为ajax请求数据,当Session失效后,ajax请 求后没有返回值,只有响应的html:<html><script type='text/javascript'>window.open('http://192.168.0.118:8080/welcomeAction/loginUI.do','_top');</script></html> 现在Ajax在Web项目中应用广泛,几乎可以说无处不在,这就带来另外一个问题:当Ajax请

javascript中Ajax请求的封装代码

/****************************ajax请求 start**************************************/ function ajaxClass(_url, _successCallback, _failureCallback, _urlParameters, _callbackParams, _async, _charset, _timeout, _frequency, _requestTimes, _frame) { /** * AJAX

jQuery 中 ajax 请求数据应用的一个小demo

举一个jquery中ajax的应用小 demo 便于以后的更多项目拓展 ,这里要注意的是保存的文件名和文件图片路径问题 ... ajax01.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title> ajax小例子 </title> </head> <body> <!--

ajax请求node.js接口时出现 No &#39;Access-Control-Allow-Origin&#39; header is present on the requested resource错误

ajax请求node.js接口出现了如下的错误: XMLHttpRequest cannot load http://xxx.xxx.xx.xx:8888/getTem?cityId=110105&date=2015-03-04. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access. 百度了一下,原来是

session过期后自动跳转到登陆页

项目需要做一个自动登出的功能,查询了网上的资料,一开始准备用session监听做,按照下面方式配置监听器 1.在项目的web.xml文件中添加如下代码: <!--添加Session监听器--> <listener> <listener-class> 监听器路径 </listener-class> </listener> 2.编写java类. public class SessionListener implements HttpSessionLi

Spring Mvc Session超时easyui tab页中ajax请求跳出问题

<!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射,添加拦截器,类级别的处理器映射 --> 拦截器配置 public class HandlerInterceptor1 extends HandlerInterceptorAdapter {//此处一般继承HandlerInterceptorAdapter适配器即可 @Override public boolean preHandle(HttpServletRequest request, HttpServletResp

js 中ajax请求时设置 http请求头中的x-requestd-with= ajax

今天发现 AngularJS 框架的$http服务提供的$http.get() /$http.post()的ajax请求中没有带 x-requested-with字段. 这样的话,后端的php 就无法判断 接受的http请求是否是 ajax请求了. 怎么办呢,显然就是给http 请求头中 加上这个字段就可以了. 1.AngularJS 中可以这样子: I don't know well MVC3 but you can set a custom header for all request fr