GVKun编程网logo

ajax请求Session失效问题(ajax请求success时出现异常怎么办)

16

关于ajax请求Session失效问题和ajax请求success时出现异常怎么办的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于ajax---解决ajax跨域请求导致session失效的

关于ajax请求Session失效问题ajax请求success时出现异常怎么办的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于ajax --- 解决ajax跨域请求导致session失效的问题、ajax Session失效如何跳转到登录页面、ajax 登录session失效登录页面跳转 ajax扩展来做、Ajax处理用户session失效等相关知识的信息别忘了在本站进行查找喔。

本文目录一览:

ajax请求Session失效问题(ajax请求success时出现异常怎么办)

ajax请求Session失效问题(ajax请求success时出现异常怎么办)

最近由于一个项目,模块切换为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请求遇到Session超时,应该怎么办?

显而易见,传统的页面跳转在此已经不适用,因为Ajax请求是XMLHTTPRequest对象发起的而不是浏览器,在验证失败后的页面跳转无法反应到浏览器中,因为服务器返回(或输出)的信息被JavaScript(XMLHTTPRequest对象)接到了。

那么应该怎么处理这种情况呢?

方法

既然服务器返回的消息被XMLHTTPRequest对象接收,而XMLHTTPRequest对象又是在JavaScript的掌控之中,那么我们是否可以利用JavaScript来完成页面跳转呢?

当然可以,而且很容易实现!但有一点,我们需要判断一下HTTP请求是否为Ajax请求(因为AJAX请求和普通的请求需要分开处理),这又如何判断呢?其实Ajax请求和普通的HTTP请求是不同的,这体现在HTTP请求的头信息中,如下所示:

上面两张图片是用火狐的Firebug截取的,前者是普通的HTTP请求头信息;后者为Ajax请求的请求头信息。注意第一图片被红框圈起来的部分,这就是Ajax请求与普通请求不同的地方,AJAX请求头中带有X-Requested-With信息,其值为XMLHttpRequest,这正是我们可以利用的地方。

下面看一下代码如何实现。

Interceptor过滤器

   在使用Struts2时,我们一般使用Interceptor(拦截器)来拦截权限问题。

拦截器部分代码:

public String intercept(ActionInvocation invocation) throws Exception {
     // Todo Auto-generated method stub
     ActionContext ac = invocation.getInvocationContext();
     HttpServletRequest request = (HttpServletRequest) ac.get(Strutsstatics.HTTP_Request);
     String requestType = request.getHeader("X-Requested-With");
     System.out.println("+++++++++++++++++++++++reqestType:"+requestType);
     HttpServletResponse response = (HttpServletResponse) ac.get(Strutsstatics.HTTP_RESPONSE);
 //    String basePath = request.getcontextpath();
     String path = request.getcontextpath(); 
     String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path; 
     //获取session
     Map session = ac.getSession();
     //判断session是否存在及session中的user信息是否存在,如果存在不用拦截
     if(session != null && session.get(Constants.FE_SESSION_BG_USER) != null && session.get(Constants.FE_SESSION_BG_AUTH) != null){
       System.out.println(invocation.getProxy().getActionName()+"++++++++++++++++++++++++");
       System.out.println("namespace:"+invocation.getProxy().getNamespace());
       //访问路径
       String visitURL = invocation.getProxy().getNamespace() + "/" + invocation.getProxy().getActionName() + Constants.FE_STRUTS_ACTION_EXTENSION;
       visitURL = visitURL.substring();
       Map<String,Object> authMap = (Map<String,Object>) session.get(Constants.FE_SESSION_BG_AUTH);
       Map<Integer,String> actionMap = (Map<Integer,String>) authMap.get(Constants.FE_BG_ACTIONMAP);
       if(actionMap != null && !actionMap.isEmpty() && visitURL != null){
         if (actionMap.containsValue(visitURL)) {
           System.out.println(visitURL+"-----------------------");
           return invocation.invoke();
         } else{
           String forbidden = basePath + Constants.FE_BG_FORBIDDEN;
           response.sendRedirect(forbidden);
           return null;
         }
       }
       return invocation.invoke();
     }else{
       if(StringUtils.isNotBlank(requestType) && requestType.equalsIgnoreCase("XMLHttpRequest")){
         response.setHeader("sessionstatus","timeout"); 
         response.sendError(,"session timeout."); 
         return null;
       }else {
         
         String actionName = invocation.getProxy().getActionName();
         System.out.println(actionName);
         //如果拦截的actionName是loginUI或login,则不做处理,否则重定向到登录页面
         if (StringUtils.isNotBlank(actionName) && actionName.equals(Constants.FE_BG_LOGINUI)) {
           return invocation.invoke();
         }else if(StringUtils.isNotBlank(actionName) && actionName.equals(Constants.FE_BG_LOGIN)){
           return invocation.invoke();
         }else{
           String login = basePath + "/" + Constants.FE_BG_LOGIN_NAMESPACE + "/" + Constants.FE_BG_LOGINUI + Constants.FE_STRUTS_ACTION_EXTENSION;
 //        System.out.println("+++++++++++++++++++++++++++basePath:"+basePath);
 //        response.sendRedirect(login);
           PrintWriter out = response.getWriter();
 //        out.println("<html>"); 
 //        out.println("<script>"); 
 //        out.println("window.open ('"+login+"','_top');"); 
 //        out.println("</script>"); 
 //        out.println("</html>");
           out.write("<html><script type='text/javascript'>window.open('"+login+"','_top');</script></html>");
           return null;
         }
       }
     }
     
   }

由上面代码可以看出,当Session验证失败(即Session超时)后,我们通过HttpServletRequest取得请求头信息X-Requested-With的值,如果不为空且等于XMLHttpRequest,那么就说明此次请求是Ajax请求,我们作出的反应就是向响应中添加一条头信息(自定义)并且使响应对象HttpServletResponse返回服务器错误信息(518状态是自己随便定义的);这些信息都会被JavaScript接收,那么下面的工作就要将由JavaScript代码了。

Javascript代码

$.ajaxSetup方法是来设置AJAX请求默认选项的,我们可以认为是全局的选项设置,因此可以将这段代码提到外部JS文件中,在需要的页面引用。

 /**
  * 设置未来(全局)的AJAX请求默认选项
  * 主要设置了AJAX请求遇到Session过期的情况
  */
 $.ajaxSetup({
   type: 'POST',complete: function(xhr,status) {
     var sessionStatus = xhr.getResponseHeader('sessionstatus');
     if(sessionStatus == 'timeout') {
       var top = getTopWiNow();
       var yes = confirm('由于您长时间没有操作,session已过期,请重新登录.');
       if (yes) {
         top.location.href = '/skynk/index.html';      
       }
     }
   }
 });
 /**
 * 在页面中任何嵌套层次的窗口中获取顶层窗口
 * @return 当前页面的顶层窗口对象
 */
 function getTopWiNow(){
   var p = window;
   while(p != p.parent){
     p = p.parent;
   }
   return p;
 }

以上内容是编程小技巧小编跟大家分享的ajax请求Session失效问题,希望对大家有用。

ajax --- 解决ajax跨域请求导致session失效的问题

ajax --- 解决ajax跨域请求导致session失效的问题

起因:http是无状态的,因此我们通常需要用到cookie以及session来保存状态,session是在服务器端存储的,会和cookie一起使用,设置了session之后,会发送给浏览器一个cookie,这个cookie是session_id,当再次请求的时候浏览器会将它发送给服务器,以此来找到对应的session.
但是,我们实际使用的时候通常会用到跨域,就是向不同的域发起请求,但是默认情况下此时cookie是不会发送给服务器的,此时就导致了丢失session_id,从而导致了session的值为undefined。解决方案如下:
首先,前端页面发起ajax请求时,加上参数:

withCredentials: true,

像这样

$.ajax({
    type:
    url:''http://localhost:8080/user-login'',
    data:
    dataType:''JSON'',//注意哦,这一句要记得加上哦,我就是因为没加这句还查了好久的
    withCredentials: true,
    success:
    error:
})

我使用的后台语言是node.js,在node.js中使用cors跨域 
在app.js中加上(注意接口的顺序哦):

app.all(''*'', function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "这里填可以跨域访问的域,不能填*哦");
    res.header("Access-Control-Allow-Headers", "X-Requested-With");
    res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
    res.header("X-Powered-By",'' 3.2.1'');
    res.header("Access-Control-Allow-Credentials",true);
    res.header("Content-Type", "application/json;charset=utf-8");
    next();
});

  ok,和bug一站到底,加油

ajax Session失效如何跳转到登录页面

ajax Session失效如何跳转到登录页面

在Struts应用中,我们发出的请求都会经过 相应的拦截器进行相关处理,一般都会有一个用户登录拦截(Session失效拦截);一般请求的话,如果Session失效时,我们会跳到登录页面,可是如果我们采用AJAX请求时,将会返回登录页面的HTML代码,这肯定不是我们想要的,那么我们如何解决呢?请看以下步骤:

一、建立拦截器

packagecom.xxx.planeap.interceptor;

importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;

importorg.apache.log4j.Logger;
importorg.apache.struts2.ServletActionContext;

importcom.opensymphony.xwork2.ActionContext;
importcom.opensymphony.xwork2.ActionInvocation;
importcom.opensymphony.xwork2.ActionSupport;
importcom.opensymphony.xwork2.interceptor.AbstractInterceptor;
importcom.xxx.common.contants.ConstantsKey;
importcom.xxx.common.contants.SessionKey;
importcom.xxx.planeap.domain.User;
importcom.xxx.planeap.security.SecurityContextUtil;

/**
*
*@authorGomaOMA1989@YEAH.NET
*@versionv1.0
*@since2012-05-31

*
*/
publicclassSecurityInterceptorextendsAbstractInterceptor{
privatestaticfinallongserialVersionUID=1L;
privateLoggerlogger=Logger.getLogger(SecurityInterceptor.class);

@Override
publicStringintercept(ActionInvocationinvocation)throwsException{
//TodoAuto-generatedmethodstub

StringclassName=invocation.getAction().getClass().getName();
Stringaction=className.substring(className.lastIndexOf(".")+1,className.length());
StringactionName=invocation.getProxy().getActionName();

Stringresult;
HttpServletRequestrequest=ServletActionContext.getRequest();
HttpServletResponseresponse=ServletActionContext.getResponse();
Stringtype=request.getHeader("X-Requested-With");
Useruser=(User)ActionContext.getContext().getSession().get(SessionKey.CURRENT_USER);
if(user==null){
logger.debug("SecurityCHECKED:NEEDTOLOGIN");
if("XMLHttpRequest".equalsIgnoreCase(type)){//AJAXREQUESTPROCESS
response.setHeader("sessionstatus",ConstantsKey.MSG_TIME_OUT);
result=null;
}else{//norMALREQUESTPROCESS
result=ActionSupport.LOGIN;
}
}else{
logger.debug("SecurityCHECKED:USERHASLOGINED");
SecurityContextUtil.setCurrentUser(user);
booleanhanPerm=SecurityContextUtil.hasPerm(action,actionName);
logger.debug("SecurityCHECKED:PERMISSION---"+action+"."+actionName+"="+hanPerm);
result=invocation.invoke();
}
returnresult;
}
}

二、定义全局AJAX请求结束处理方法

//全局的AJAX访问,处理AJAX清求时SESSION超时

$.ajaxSetup({

contentType:"application/x-www-form-urlencoded;charset=utf-8",

complete:function(XMLHttpRequest,textStatus){

//通过XMLHttpRequest取得响应头,sessionstatus

var sessionstatus=XMLHttpRequest.getResponseHeader("sessionstatus");

if(sessionstatus=="timeout"){

//这里怎么处理在你,这里跳转的登录页面

window.location.replace(PlanEap.getActionURI("login"));

}

}

});

ajax 登录session失效登录页面跳转 ajax扩展来做

ajax 登录session失效登录页面跳转 ajax扩展来做

今天过的时间有点久了以后,去点击layer查询的时候,提示接口失效

其实是session会话失效了。layer去请求的时候,经过拦截器,经过判断。session会话失效了。返回一段登录页面跳转。但是ajax不能执行跳转。所以经过前端调试,能看到一段response响应

那针对这种问题,要怎么做呢?百度以后得知,可以用ajax扩展来做。要不然的话,就只得改变每个的ajax的方法。但是这种也不太实现呀。太麻烦了。所以用ajax扩展来做

了解一下用法:

(function($){….})(jQuery)定义了一个匿名函数,然后又调用该函数,并传递实参jQuery

$.extend去扩展原生的jquery.ajax为jQuery类本身扩展,添加新的方法或覆盖原有的方法


我们现在的ajax请求只是在执行之前,先判断一下是否登录过。如果登录失效。就进行跳转操作,

如果在调用ajax请求的时候,什么写法都不用改变。只需要按照普通方法调用就行
这个是登录拦截器。

Ajax处理用户session失效

Ajax处理用户session失效

这次给大家带来ajax处理用户session失效,ajax处理用户session失效的注意事项有哪些,下面就是实战案例,一起来看一下。

在使用spingMVC的拦截器来处理用户session失效的问题时,当用户session失效会返回一串javascript字符串强制用户浏览器跳转至登录页面。然而当使用Ajax请求数据时,在验证失败后只会响应一串字符串,JavaScript并不会执行,这是由于Ajax的请求是由XMLHTTPRequest对象发起的而不是浏览器,在验证失败后服务器返回的信息会被XMLHTTPRequest对象接收到并保存在js对象中。

为了应对这种情况,可以在后台对Http请求先进行判断,将Ajax请求与普通http请求分开处理。
观察Ajax发送的请求头信息可以发现,Ajax请求的头信息中会带有X-Requested-With:XMLHttpRequest,通过这个可以判断是否是Ajax请求。

String requestType = request.getHeader("X-Requested-With");
if(requestType !=null&amp;&amp;"XMLHttpRequest".equalsIgnoreCase(requestType.trim())) {
  //如果是ajax请求
  response.setHeader("sessionStatus","timeout");
  response.sendError(601,"session timeout.");
  returnfalse;
}
登录后复制

 javascript代码,可以设置Ajax请求的全局默认options,一劳永逸

//设置Ajax请求的全局默认options
jQuery.ajaxSetup({
  type:''post'',
  complete:function(xhr, ts){//XMLHttpRequest, textStatus
    varsessionStatus = xhr.getResponseHeader(''sessionstatus'');
    if(sessionStatus ==''timeout'') {
      alert(''页面过期,请重新登录!'');
      window.top.location.href =''Login.htm''
    }
  }
});
登录后复制

项目中还使用到了DataTables做数据表格,发现用上边javascript的配置方法在datatables中不能生效,错误信息参见:http://datatables.net/tn/7 要配置ajax的error属性才可以 

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

JS实现棋盘覆盖

js寄生组合式继承使用详解

以上就是Ajax处理用户session失效的详细内容,更多请关注php中文网其它相关文章!

关于ajax请求Session失效问题ajax请求success时出现异常怎么办的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于ajax --- 解决ajax跨域请求导致session失效的问题、ajax Session失效如何跳转到登录页面、ajax 登录session失效登录页面跳转 ajax扩展来做、Ajax处理用户session失效的相关知识,请在本站寻找。

本文标签: