(本代码需要在redis环境下才能实现)
思路:
1.在登录的时候监听登录的session,把sessionid和用户表示存在redis。(key:用户表示 ;value:sessionid)。
session监听:实现HttpSessionListener,HttpSessionAttributeListener。
2.写一个过滤器,过滤请求的session。
代码:
1.session监听
public void attributeAdded(HttpSessionBindingEvent event) {
// TODO Auto-generated method stub
String name = event.getName();
log.info("当前session名称:" + name);
//判断当前是不是登录
if(name.equals("LoginSession")){
log.info(" ----------登录session监听------strat--------------");
//根据name来获取登录的session
String sessionid = event.getSession().getId(); //获取当前登录的sessionid
/**
这里你要连接你的redis。具体代码百度一下
*/
//把用户表示和sessionid存入缓存,并且给一个时间 为了防止直接关闭浏览器导致session不过期。一直存在于缓存。
JedisCluster cluster = new JedisCluster(nodes);
//判断缓存里面有没有sessionid
cluster.set(uid, sessionid);
cluster.expire(uid, 300);
log.info(loginUser.getNickname()+"登录中!");
log.info(" ----------登录session监听------end--------------");
}
}
2.过滤器
public class SessionFilter implements Filter{
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@SuppressWarnings("null")
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain nextFilter) throws IOException, ServletException {
// TODO Auto-generated method stub
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
HttpSession session = (HttpSession) request.getSession();
if(request.isRequestedSessionIdValid())
//获取当前请求的sessionid
String sessionid = session.getId();
LoginSession login = (LoginSession) request.getSession().getAttribute("LoginSession");
if(login != null){
String uid = login.getUid();
//从缓存中取得当前uid的sessionid
JedisCluster cluster = new JedisCluster(nodes);
String redis_sessionid = cluster.get(uid);
cluster.expire(uid, 300);//redis失效时间刷新
//判断请求session是不是被另外一个客户登录
if(redis_sessionid != null){
//如果当前的sessionId和redis的sessionid不一致,那是因为有人登陆了这个账号
if(!redis_sessionid.equals(sessionid)){
session.invalidate();//让当前请求的session失效
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<script language='JavaScript' type='text/JavaScript'>");
out.println("alert('您的账号在异地登录,已被迫下线!')");
out.println("history.back();");
out.println("</script>");
out.close();
response.sendRedirect("/index.jsp");
return;
}
}
}
}else{
request.getSession().invalidate();
}
nextFilter.doFilter(request, response);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}