加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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.
String requestType = req.getHeader("X-Requested-With");

因为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;
}
}
});
});

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读