Ajax Session Timeout处理
发布时间:2020-12-15 21:52:05 所属栏目:百科 来源:网络整理
导读:对于session过期跳转的问题,很简单,就是一个过滤器,然后判断session为空?跳转:继续。但是对于ajax的请求,需要做特殊处理,见下面代码中的 // 此处考虑ajax操作session过期的操作,如果ajax请求过程中session过期,则指定过期状态码为:911. String req
对于session过期跳转的问题,很简单,就是一个过滤器,然后判断session为空?跳转:继续。但是对于ajax的请求,需要做特殊处理,见下面代码中的 // 此处考虑ajax操作session过期的操作,如果ajax请求过程中session过期,则指定过期状态码为:911. 因为ajax请求的时候请求头是:X-Requested-With,so我们可以根据该请求头做session过期处理。 下面是过滤器的实现,可以作为参考。 packagecom.***.action.util; importjava.io.IOException; importjava.net.URLEncoder; importjava.util.ArrayList; importjava.util.List; importjavax.servlet.Filter; importjavax.servlet.FilterChain; importjavax.servlet.FilterConfig; importjavax.servlet.ServletException; importjavax.servlet.ServletRequest; importjavax.servlet.ServletResponse; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse; importjavax.servlet.http.HttpSession; importorg.apache.commons.lang3.StringUtils; importorg.apache.commons.logging.Log; importorg.apache.commons.logging.LogFactory; /** *标题:SessionFilter. * *描述:sessionexpirefilter. * *@authorlgscofield. */ publicclassSessionFilterimplementsFilter{ privatefinalstaticLogLOGGER=LogFactory.getLog(SessionFilter.class); /** *过滤器配置 */ privateFilterConfigfilterConfig; /** *超时页面 */ protectedStringsessionTimeOutPage=null; /** *某些url前缀列表(如:/css/*,/js/*,/images/***...) */ privateList<String>ignoreURIs=newArrayList<String>(); /** *静态资源列表(如:*.css,*.js,*.jpg...) */ privateList<String>ignoreExts=newArrayList<String>(); /** *个别动态资源(如:login.action,navigate.action,login.jsp...) */ privateList<String>ignoreActions=newArrayList<String>(); /** *DefaultConstruct. */ publicSessionFilter(){ super(); } @Override publicvoidinit(FilterConfigfilterConfig)throwsServletException{ LOGGER.info("InitLogFilterStart."); this.filterConfig=filterConfig; //this.context=this.filterConfig.getServletContext(); //startMonitor(); //某些URL前缀不予处理(例如/img/***) Stringignores=filterConfig.getInitParameter("ignore"); if(ignores!=null){ for(Stringig:StringUtils.split(ignores,',')){ ignoreURIs.add(ig.trim()); } } //某些URL扩展名不予处理(例如*.jpg) ignores=filterConfig.getInitParameter("ignoreExts"); if(ignores!=null){ for(Stringig:StringUtils.split(ignores,')){ ignoreExts.add('.'+ig.trim()); } } //某写页面及Action不予处理(例如login.jsp,login.action) ignores=filterConfig.getInitParameter("ignoreActions"); if(ignores!=null){ for(Stringig:StringUtils.split(ignores,')){ ignoreActions.add(ig.trim()); } } LOGGER.info("InitLogFilterEnd."); } @Override publicvoiddestroy(){ this.filterConfig=null; } @Override publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{ HttpServletRequestreq=(HttpServletRequest)request; HttpServletResponseresp=(HttpServletResponse)response; //HttpServletResponseWrapperwrapper=newHttpServletResponseWrapper((HttpServletResponse)response); resp.setCharacterEncoding("UTF-8"); HttpSessionsession=req.getSession(true); StringrequestUrl=req.getRequestURI(); StringredirectPath=req.getContextPath()+"/navigate.action"; try{ //过滤URL前缀 /* *for(StringignoreURI:ignoreURIs){if(requestUrl.startsWith(ignoreURI)){chain.doFilter(req,resp); *return;}} */ //过滤URL后缀 for(StringignoreExt:ignoreExts){ if(requestUrl.endsWith(ignoreExt)){ chain.doFilter(req,resp); return; } } //过滤登陆action/jsp for(StringingonAction:ignoreActions){ if(isContains(requestUrl,ingonAction)){ chain.doFilter(req,resp); return; } } if(requestUrl.endsWith("/portal/")||requestUrl.endsWith("/portal")){ resp.sendRedirect(redirectPath); return; } }catch(SecurityExceptione){ StringloginPage=req.getContextPath()+URLEncoder.encode(requestUrl,"utf-8"); resp.sendRedirect(loginPage); } //验证session是否过期 Objectuser=session.getAttribute("userInfo"); if(user==null){ //此处考虑ajax操作session过期的操作,如果ajax请求过程中session过期,则指定过期状态码为:911. StringrequestType=req.getHeader("X-Requested-With"); if(!StringUtils.isEmpty(requestType)&&requestType.equalsIgnoreCase("XMLHttpRequest")){ resp.setStatus(911); resp.setHeader("sessionstatus","timeout"); resp.addHeader("loginPath",redirectPath); return; }else{ //wrapper.sendRedirect(redirectPath); resp.sendRedirect(redirectPath); return; } }else{ chain.doFilter(request,response); return; } } publicstaticbooleanisContains(Stringcontainer,Stringregx){ booleanresult=false; if(container.indexOf(regx)!=-1){ returntrue; } returnresult; } } 最后就是页面上的处理了,此处应用了jquery全局事件处理机制: $(function(){ $.ajaxSetup({ contentType:"application/x-www-form-urlencoded;charset=utf-8",cache:false,complete:function(XHR,TS){ varresText=XHR.responseText; varsessionstatus=XHR.getResponseHeader("sessionstatus"); varloginPath=XHR.getResponseHeader("loginPath"); if(911==XHR.status&&"timeout"==sessionstatus){ //此处使用了开源的消息确认框 $.messager.confirm('session过期','您的会话已经过期,请重新登陆后继续操作!',function(confirm){ if(confirm){ window.location.replace(loginPath); } }); //也可以使用下面的原生js的确认框,如果确认则跳转 if(window.confirm('session过期','您的会话已经过期,请重新登陆后继续操作!')){ window.location.replace(loginPath); } return; } } }); }); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |