此处将为大家介绍关于Ajax请求session失效该如何解决的详细内容,并且为您解答有关ajax请求success时出现异常怎么办的相关问题,此外,我们还将为您介绍关于ajax---解决ajax跨域请
此处将为大家介绍关于Ajax请求session失效该如何解决的详细内容,并且为您解答有关ajax请求success时出现异常怎么办的相关问题,此外,我们还将为您介绍关于ajax --- 解决ajax跨域请求导致session失效的问题、ajax Session失效如何跳转到登录页面、Ajax Session失效跳转登录页面的方法、ajax 操作全局监测,用户session失效的解决方法的有用信息。
本文目录一览:- Ajax请求session失效该如何解决(ajax请求success时出现异常怎么办)
- ajax --- 解决ajax跨域请求导致session失效的问题
- ajax Session失效如何跳转到登录页面
- Ajax Session失效跳转登录页面的方法
- ajax 操作全局监测,用户session失效的解决方法
Ajax请求session失效该如何解决(ajax请求success时出现异常怎么办)
一般来说我们的项目都有登录过滤器,一般请求足以搞定。但是AJAX却是例外的,所以解决方法是设置响应为session失效。
一共分为过滤器和页面JS两个部分的设置,先看过滤器的修改:
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; import javax.servlet.http.HttpSession; /** * 登录过滤器 * 拥有Session是否失效和用户是否登录2个条件判断 * 如果是ajax请求则设置session超时 * @author merlin.Ma * */ public class LoginFilter implements Filter{ private String redirectUrl = "/login.html"; private String sessionKey = "userName"; @Override public void destroy() { } @Override public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throws IOException,servletexception { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse rep = (HttpServletResponse) response; HttpSession session = req.getSession(); if( session == null || session.getAttribute(sessionKey) == null){ //如果判断是 AJAX 请求,直接设置为session超时 if( req.getHeader("x-requested-with") != null && req.getHeader("x-requested-with").equals("XMLHttpRequest") ) { rep.setHeader("sessionstatus","timeout"); } else { rep.sendRedirect( req.getcontextpath() + redirectUrl); } }else { chain.doFilter(request,response); } } @Override public void init(FilterConfig filterConfig) throws servletexception { String url = filterConfig.getinitParameter("redirectUrl"); String key = filterConfig.getinitParameter("sessionKey"); redirectUrl = url == null? redirectUrl:url; sessionKey = key == null ? sessionKey : key ; } }
代码简单,就不过多进行注释了,现在看JS部分的代码。当然是基于jQuery的~~
//全局的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("login.html"); } } });
页面加载这段js代码,然后开始调用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失效跳转登录页面的方法
在Struts应用中,我们发出的请求都会经过 相应的拦截器进行相关处理,一般都会有一个用户登录拦截(Session失效拦截);一般请求的话,如果Session失效时,我们会跳到登录页面,可是如果我们采用AJAX请求时,将会返回登录页面的HTML代码,这肯定不是我们想要的,那么我们如何解决呢?请看以下步骤:
一、建立拦截器
package com.xxx.planeap.interceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.log4j.Logger; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; import com.xxx.common.contants.ConstantsKey; import com.xxx.common.contants.SessionKey; import com.xxx.planeap.domain.User; import com.xxx.planeap.security.SecurityContextUtil; /** * * @author Goma OMA1989@YEAH.NET * @version v1.0 * @since 2012-05-31 * */ public class SecurityInterceptor extends AbstractInterceptor { private static final long serialVersionUID = 1L; private Logger logger = Logger.getLogger(SecurityInterceptor.class); @Override public String intercept(ActionInvocation invocation) throws Exception { // TODO Auto-generated method stub String className = invocation.getAction().getClass().getName(); String action = className.substring(className.lastIndexOf(".")+1,className.length()); String actionName = invocation.getProxy().getActionName(); String result; HttpServletRequest request = ServletActionContext.getRequest(); HttpServletResponse response = ServletActionContext.getResponse(); String type = request.getHeader("X-Requested-With"); User user = (User) ActionContext.getContext().getSession().get(SessionKey.CURRENT_USER); if (user == null) { logger.debug("SECURITY CHECKED: NEED TO LOGIN"); if ("XMLHttpRequest".equalsIgnoreCase(type)) {// AJAX REQUEST PROCESS response.setHeader("sessionstatus", ConstantsKey.MSG_TIME_OUT); result = null; } else {// NORMAL REQUEST PROCESS result = ActionSupport.LOGIN; } } else { logger.debug("SECURITY CHECKED: USER HAS LOGINED"); SecurityContextUtil.setCurrentUser(user); boolean hanPerm = SecurityContextUtil.hasPerm(action, actionName); logger.debug("SECURITY CHECKED: PERMISSION---"+action+"."+actionName+"="+hanPerm); result = invocation.invoke(); } return result; } }
二、定义全局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发送请求时如果拦截返回一个表示就跳转,否则执行正常操作。
- express如何解决ajax跨域访问session失效问题详解
- 使用Ajax时处理用户session失效问题的解决方法
- 完美解决ajax访问遇到Session失效的问题
- ajax 操作全局监测,用户session失效的解决方法
- ajax在兼容模式下失效的快速解决方法
- Ajax请求session失效该如何解决
- 如何解决ajax在google chrome浏览器上失效
- ajax请求Session失效问题
- ajax更新数据后,jquery、jq失效问题
- 解决IE9下JQuery发送ajax请求失效的方法
ajax 操作全局监测,用户session失效的解决方法
ajax 操作全局监测,用户session失效的解决方法
jQuery(function ($) { // 备份jquery的ajax方法 var _ajax = $.ajax; // 重写ajax方法,先判断登录在执行success函数 $.ajax = function (opt) { var _success = opt && opt.success || function (a, b) { }; var _opt = $.extend(opt, { success: function (data, textStatus) { try { if (data.sessionstatus == false) { //用户失效进行操作 //return; } } catch (e) { } _success(data, textStatus); } }); _ajax(_opt); }; });
以上这篇ajax 操作全局监测,用户session失效的解决方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
- express如何解决ajax跨域访问session失效问题详解
- 使用Ajax时处理用户session失效问题的解决方法
- 完美解决ajax访问遇到Session失效的问题
- Ajax Session失效跳转登录页面的方法
- ajax在兼容模式下失效的快速解决方法
- Ajax请求session失效该如何解决
- 如何解决ajax在google chrome浏览器上失效
- ajax请求Session失效问题
- ajax更新数据后,jquery、jq失效问题
- 解决IE9下JQuery发送ajax请求失效的方法
关于Ajax请求session失效该如何解决和ajax请求success时出现异常怎么办的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于ajax --- 解决ajax跨域请求导致session失效的问题、ajax Session失效如何跳转到登录页面、Ajax Session失效跳转登录页面的方法、ajax 操作全局监测,用户session失效的解决方法等相关内容,可以在本站寻找。
本文标签: