GVKun编程网logo

Ajax请求Session超时的处理(ajax请求超时如何提示处理)

8

在本文中,我们将给您介绍关于Ajax请求Session超时的处理的详细内容,并且为您解答ajax请求超时如何提示处理的相关问题,此外,我们还将为您提供关于Ajax请求Session超时解决、Ajax应

在本文中,我们将给您介绍关于Ajax请求Session超时的处理的详细内容,并且为您解答ajax请求超时如何提示处理的相关问题,此外,我们还将为您提供关于Ajax 请求 Session 超时解决、Ajax应用中Session超时的一种解决方案、ajax异步请求,session超时处理、ajax提交session超时跳转页面使用全局的方法来处理的知识。

本文目录一览:

Ajax请求Session超时的处理(ajax请求超时如何提示处理)

Ajax请求Session超时的处理(ajax请求超时如何提示处理)

Ajax请求后台数据虽然会被过滤器filter拦截,但是因为Ajax操作与对页面整个页面的提交请求不一样,filter中的重定向并不能使之跳到一个新的页面,因此需要我们去做特殊的处理。处理原理很简单,如果session超时,filter返回一个超时标识给客户端,客户端检测到超时头信息,跳转到指定页面。

1、客户端的js处理(使用jqury)

	<script type="text/javascript">
			//<![CDATA[  
		 	$(document).ajaxComplete(function(event,xhr,settings) {
				if(xhr.getResponseHeader("sessionstatus")=="timeOut"){
					if(xhr.getResponseHeader("loginPath")){
						window.location.replace(xhr.getResponseHeader("loginPath"));
					}else{
						alert("Request time out relogin plase !");
					}
				}
			}); 
			//]]>
		</script>

2、服务器端处理(filter中)
	if(sessionTimeOut){
	//判断是否为ajax请求
		if (httpRequest.getHeader("x-requested-with") != null && httpRequest.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")) {
			HttpServletResponse httpResponse = (HttpServletResponse)response;
			httpresponse.addheader("sessionstatus","timeOut");
			httpresponse.addheader("loginPath",loginUrl);
			filterChain.doFilter(request,response);//不可少,否则请求会出错
		}else{//不是ajax请求,超时直接重定向
			((HttpServletResponse) response).sendRedirect(loginUrl);
		}
	}

Ajax 请求 Session 超时解决

Ajax 请求 Session 超时解决

$.ajaxSetup({
    contentType : "application/x-www-form-urlencoded;charset=utf-8",
    complete : function(xhr, textStatus) {
        if (xhr.status == 520) {//如果返回状态码是520
            window.location..reload();//刷新页面,执行登录逻辑
            return;
        }
    }
});

java 代码:

  1. 写一个 filter

import java.io.IOException;

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;

public class SessionTimeoutFilter implements Filter {

    public void destroy() {

    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;
        // 判断session里是否有用户信息
        if (req.getSession().getAttribute("username") == null){
            // 如果是ajax请求响应头会有,x-requested-with;
            if (req.getHeader("x-requested-with") != null && req.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")){
                res.setStatus(520);//表示session timeout
            }else{
                chain.doFilter(req, res);
            }
        }else{
            chain.doFilter(req, res);
        }
    }

    public void init(FilterConfig chain) throws ServletException {

    }
}

 

转载地址: https://www.cnblogs.com/cxyj/p/3884964.html

 

Ajax应用中Session超时的一种解决方案

Ajax应用中Session超时的一种解决方案

http://blog.csdn.net/owen4751076/article/details/2700501

http://coolvinson.iteye.com/blog/500868


场景:一个基于Ajax技术的Web应用,采用的是多页面方式 ,每个页面内部使用Ajax实现复杂业务逻辑之间的无刷新切换,使用了Struts来实现MVC。

问题:对于Ajax请求,只有在通过用户验证无误之后才能对请求作出响应。如果用户长时间不做操作导致Session过时之后才发出请求,则此时应该跳转到出错页面,提示用户重新登录。对于非Ajax请求,可以自定义异常并针对此异常设置相应的出错页面。在用户信息验证失败的时候直接抛出此异常即可,web容器会自动捕捉到此异常并且显示出错页面;但是,对于Ajax请求,则不会如期待的那样自动跳转到出错页面。若不错特殊处理,Ajax请求的回调函数会得到意想不到的数据而导致程序出错。

分析:对于一个Ajax的应用,每一次客户端和服务器的数据交互,可以看成是在一个由客户端的XMLHttpRequest和服务器端的Servlet(这里假设用Servlet响应Ajax请求)组成的闭合管道(如图1)中进行的:


图1
所有从服务器端得到的数据流都会被XMLHttpRqeuest对象获得,然后由回调函数做出相应处理。
一般而言,用户登录之后,将用户信息是存放在Session中。做用户验证,其实就是检查此时Session中用户信息是否存在或者是否正确。如果在每次逻辑处理之前都去做这样的重复检查,并且检查的方法会发生改变,这样的程序既不精简还缺少可维护性。相信很少有人这么做。
比较好的做法是使用Filter( Servlet2.3之后才行)来做这样的通用检查,简单而且修改规则也很容易。Filter在应用中的作用之处如图2所示:

图2
另外,还可以添加具有不同功能的Filter,形成一个Filter链。
可以看到,在请求还没有到达Servlet之前,可以对请求作一些处理之后再提交给Servlet;在Servlet发出响应但还没有到达客户端之前,还可以对响应作处理。因此,作用户检查之类的工作由Filter来完成是比较合理的。
并不是说经过Filter的请求最终一定会到达Servlet。因为Filter有权操作Request和Response,所以Filter完全可以自己向客户端直接返回响应,从而中止此次交互:

图3
如图3所示,若是检查用户信息失败,Filter可以直接返回响应。
到这里,应该比较清楚了,在用户信息验证出错情况下,若要使得客户端能自动显示出错提示页面,应该让Ajax请求所对应的回调函数去做。
如果只是很简单的少数请求,则可以在Filter中返回出错标志,然后在回调函数中作判断进行相应的页面跳转处理。但是,对于一个复杂的应用,如果每个回调函数中都要添加这样的判断,或者服务器端定义的出错标志发生改变,则会大大降低程序的可维护性。
对于稍稍复杂的Ajax应用,一般都会使用一个共通的模块来操作Ajax的请求(比如创建跨浏览器的XMLHttpRequest对象等等)。如果能在这样的通用模块中具有可以在回调函数被调用之前获得服务器返回数据的能力,则可以做通用的出错判断,而不必修改每一个回调函数。

比如下面的这个通用模块:

function sendRequest(callback,data,method,url,async,sload,user,password)
{
//创建XMLHttpRequest对象
varoj=createHttpRequest();
if(oj==null)returnnull;
...
if(typeofcallback=='object'){
varcallback_onload=callback.onload;
varcallback_onbeforsetheader=callback.onbeforsetheader;
}
else{
varcallback_onload=callback;
varcallback_onbeforsetheader=null;
}


oj.onload
=function(){
callback_onload(oj);
}

...
oj.open(method,password);
...
oj.send(data);
}
可以在 callback_onload(oj); 之前添加对出错标志的判断。到此处,问题已经得到解决。
如果以后要更改出错标志或者是出错页面,则此处也要做相应的更改才行。如何能更“智能”一点呢?
既然Filter可以返回出错标志,那当然也可以返回javascript代码了!如果能在此处动态地执行一段代码,不就解决问题了吗?想到javascript的 eval函数了吧!对,就是它!代码很简单:
oj.onload = function () {
try{
eval(oj.responseText);
}
catch(e)@H_301_240@{}


callback_onload(oj);
}
如果是正常情况下返回的数据, eval函数执行后不会引起程序异常;如果是一段javascript代码,则会得到执行,客户端的Ajax调用也不要做任何修改。 返回到Filter,若是用户验证失败,并且是Ajax请求可以返回一段让页面自动跳转的javascript代码;若是普通的非Ajax请求,则可以放心地抛出异常。经过验证,在Ajax请求和非Ajax请求的情况下,二者的客户体验是相同的。对于页面跳转,其实方法很多,这里就省略代码了。 同理,如果继续添加用户权限检查等等的Filter,则可以地向客户端发出各种不同的javascript代码,很轻松实现相应的功能而客户端无需作修改。 总结:对于Ajax的请求,其数据流是封闭的,服务器发送给在客户端的数据都被XMLHttpRequest对象所获得。本文通过从Filter中发出javascript代码让其在客户端得到执行,从而可以在session过时验证用户信息失败之后,让客户端自动显示出错页面,与非Ajax请求时的客户体验相一致。对于Ajax请求,此方法进一步推广,可以直接在服务器端发出javascript让其在客户端得到执行。 PS:ajax请求在header里会多出这样的参数值对name:X-Requested-With value:XMLHttpRequest

ajax异步请求,session超时处理

ajax异步请求,session超时处理

在web开发中,通常会有session超时处理,对于普通的http请求比较容易处理,而对于ajax异步请求,可能就需要特殊处理了

/*服务器端:拦截器或过滤器处理:*/

//异步请求session超时的处理
if(request.getHeader("x-requested-with")!=null&&
request.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")){
PrintWriterwirter=response.getWriter();
wirter.write("timeout");
wirter.flush();
}else{				
//普通http请求session超时的处理
returnAction.LOGIN;
}
/*浏览器端:JQuery添加全局AJAX默认选项:complete回调函数:*/

$.ajaxSetup({
	global:false,type:"POST",complete:function(XMLHttpRequest,textStatus){
		vardata=XMLHttpRequest.responseText;
		if(data=="timeout"){
			if(window.top!=window.self){
				window.top.location="${pageContext.request.contextpath}";
			}
		}
	}
});

另注:

jquery中各个事件执行顺序如下:
ajaxStart(全局事件)
beforeSend
ajaxSend(全局事件)
success
ajaxSuccess(全局事件)
error
ajaxError(全局事件)
complete
ajaxComplete(全局事件)
ajaxStop(全局事件)

另转:

http://bbs.csdn.net/topics/390492485

统一封装AJAX请求吧,监听响应头,如果sessionStatus是timeout 那就 用JS跳到登录就好了 window.location

functioncheckSessionTimeout(response){
	if(response.getResponseHeader){
		varsessionStatus=response.getResponseHeader("sessionstatus");
		if(sessionStatus=='timeout'){
			varredirect=response.getResponseHeader("Location");
			window.location=redirect;
			return;
		}
	}
}

自定义一个拦截器,在timeout的时候丢出

response.setHeader("Location",request.getcontextpath()+timeoutUrl);
response.sendError(HttpServletResponse.SC_FORBIDDEN,"登录超时或无效!");
response.setHeader("sessionstatus","timeout");

可以根据请求头来判断请求是不是ajax,如果是普通的就不需要直接跳到登录就好了,如果是AJAX就丢出一个状态码。如果不想自定义拦截器的话,直接监听响应的状态码也可以

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

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

在过滤器中写入如下方法:
复制代码 代码如下:

public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest httprequest = (HttpServletRequest) request;
HttpServletResponse httpresponse = (HttpServletResponse) response;
String url = httprequest.getRequestURL().toString();
if (httprequest.getSession()== null) {
if (httprequest.getHeader("x-requested-with") != null
&& httprequest.getHeader("x-requested-with").equals(
"XMLHttpRequest")) { // ajax请求
httpresponse.setHeader("sessionstatus", "timeout");
} else {
httpresponse.sendRedirect("/test/index.jsp");
return;
}
} else {
chain.doFilter(request, response);
}
}

这样,如果session超时,而且是ajax请求,就会在响应头里,sessionstatus有一个timeout;

再用一个全局的方法来处理,session超时要跳转的页面。

jquery 可以用$.ajaxSetup 方法,ext也有类似的方法:
复制代码 代码如下:

//全局的ajax访问,处理ajax清求时sesion超时
$.ajaxSetup({
contentType : "application/x-www-form-urlencoded;charset=utf-8",
complete : function(XMLHttpRequest, textStatus) {
var sessionstatus = XMLHttpRequest.getResponseHeader("sessionstatus"); // 通过XMLHttpRequest取得响应头,sessionstatus,
if (sessionstatus == "timeout") {
// 如果超时就处理 ,指定要跳转的页面
window.location.replace("/test/index.jsp");
}
}
});
您可能感兴趣的文章:
  • Java Web实现session过期后自动跳转到登陆页功能【基于过滤器】
  • 详解springmvc控制登录用户session失效后跳转登录页面
  • php页面跳转session cookie丢失导致不能登录等问题的解决方法
  • webix+springmvc session超时跳转登录页面
  • jQuery ajax全局函数处理session过期后的ajax跳转问题
  • Jsp中解决session过期跳转到登陆页面并跳出iframe框架的方法
  • Session过期后自动跳转到登录页面的实例代码
  • Ajax Session失效跳转登录页面的方法
  • Session过期后实现自动跳转登录页面

今天的关于Ajax请求Session超时的处理ajax请求超时如何提示处理的分享已经结束,谢谢您的关注,如果想了解更多关于Ajax 请求 Session 超时解决、Ajax应用中Session超时的一种解决方案、ajax异步请求,session超时处理、ajax提交session超时跳转页面使用全局的方法来处理的相关知识,请在本站进行查询。

本文标签:

上一篇Ajax+Servlet实现无刷新下拉联动(ajax页面无刷新)

下一篇ajax session过期 页面跳转问题(shiro ajax 过期)