在本文中,我们将给您介绍关于Ajax请求Session超时的处理的详细内容,并且为您解答ajax请求超时如何提示处理的相关问题,此外,我们还将为您提供关于Ajax请求Session超时解决、Ajax应
在本文中,我们将给您介绍关于Ajax请求Session超时的处理的详细内容,并且为您解答ajax请求超时如何提示处理的相关问题,此外,我们还将为您提供关于Ajax 请求 Session 超时解决、Ajax应用中Session超时的一种解决方案、ajax异步请求,session超时处理、ajax提交session超时跳转页面使用全局的方法来处理的知识。
本文目录一览:- Ajax请求Session超时的处理(ajax请求超时如何提示处理)
- Ajax 请求 Session 超时解决
- Ajax应用中Session超时的一种解决方案
- ajax异步请求,session超时处理
- ajax提交session超时跳转页面使用全局的方法来处理
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 超时解决
$.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超时的一种解决方案
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)中进行的:
一般而言,用户登录之后,将用户信息是存放在Session中。做用户验证,其实就是检查此时Session中用户信息是否存在或者是否正确。如果在每次逻辑处理之前都去做这样的重复检查,并且检查的方法会发生改变,这样的程序既不精简还缺少可维护性。相信很少有人这么做。
比较好的做法是使用Filter( Servlet2.3之后才行)来做这样的通用检查,简单而且修改规则也很容易。Filter在应用中的作用之处如图2所示:
图2
可以看到,在请求还没有到达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函数了吧!对,就是它!代码很简单:
try{
eval(oj.responseText);
}catch(e)@H_301_240@{}
callback_onload(oj);
}
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超时跳转页面使用全局的方法来处理
在过滤器中写入如下方法: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");
}
}
});