工作笔记 用户重复登录及异常退出的问题

需要解决的问题:

1.记录用户的登录状态,禁止用户重复登录。
2.当用户异常退出时,如关闭浏览器,死机等,允许用户重新登录。
3.用户长时间不操作,session失效时,停止更新用户的登录状态。

解决方案:

1.在数据库记录用户的登陆状态,以及登录时间,最后登录时间,登录状态等信息。
当有用户登录时,判断登录状态,如已经登陆,则拒绝。否则,[color=red]计算当前时间与最后登录时间的间隔[/color],如超过一定间隔,如一分钟,则允许登陆。

2.在主界面jsp中,创建timer,定时调用ajax请求,来更新用户的最后登录时间。
[color=red]var intervalId =setInterval('updateUserInfo()',1000*30);[/color]

3.超时情况下,因为只要jsp页面没有关闭,timer就会一直更新,所以要解决这个问题,创建filter。在超时后,手动invalid该session,并[color=red]在ajax的response中返回 stop来终止timer[/color]的ajax请求:if(ret=='stop'){
[color=red]clearInterval(intervalId);[/color]
}。


filter部分源码:

@Override
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
if (req instanceof HttpServletRequest) {
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)res;
HttpSession session = request.getSession();
String reqUrl = request.getRequestURI();
logger.debug("===request.getRequestURI==="+request.getRequestURI());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
i[color=red]f (reqUrl!=null) {
if (reqUrl.contains("UseruUnormallyLogOut")) {

String last =(String)session.getAttribute("sessionLastRealAccessTime");[/color]
Date lastDate=null;
try {
Date nowDate = sdf.parse(sdf.format(new Date()));
if (last!=null) {
lastDate = sdf.parse(last);
logger.debug("===nowDate.getTime()==="+nowDate.getTime());
logger.debug("===lastDate.getTime()==="+lastDate.getTime());
long timediff = nowDate.getTime()-lastDate.getTime();
long sec = timediff/1000;
logger.debug("===timediff==="+timediff);
//config is ?
long sessionConfig = 60*30;
logger.debug("===sec==="+sec);
if (sec>sessionConfig) {
session.setAttribute("userSessionTimeout", "true");
}
}
} catch (Exception e) {
logger.debug(e.getMessage());
logger.debug(e.getStackTrace().toString());
}

}[color=red]else{
//update the real access time
session.setAttribute("userSessionTimeout", "false");
Date date = new Date();
//update access time
session.setAttribute("sessionLastRealAccessTime",sdf.format(date));[/color]
}
}
chain.doFilter(req, res);
}
}

你可能感兴趣的:(工作笔记)