关于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 --- 解决ajax跨域请求导致session失效的问题
- ajax Session失效如何跳转到登录页面
- ajax 登录session失效登录页面跳转 ajax扩展来做
- Ajax处理用户session失效
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失效的问题
起因: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失效如何跳转到登录页面
在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扩展来做
今天过的时间有点久了以后,去点击layer查询的时候,提示接口失效
其实是session会话失效了。layer去请求的时候,经过拦截器,经过判断。session会话失效了。返回一段登录页面跳转。但是ajax不能执行跳转。所以经过前端调试,能看到一段response响应
那针对这种问题,要怎么做呢?百度以后得知,可以用ajax扩展来做。要不然的话,就只得改变每个的ajax的方法。但是这种也不太实现呀。太麻烦了。所以用ajax扩展来做
了解一下用法:
(function($){….})(jQuery)定义了一个匿名函数,然后又调用该函数,并传递实参jQuery
$.extend去扩展原生的jquery.ajax为jQuery类本身扩展,添加新的方法或覆盖原有的方法
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&&"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失效的相关知识,请在本站寻找。
本文标签: