package net.loyin.listener;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import net.loyin.memcache.MemcacheTool;
/**
* sessin监听器,统计在线客户端数及ip数量,以及处理失效后的memcache内容管理
* @author 龙影 loyin
* 2012-10-28
*/
public class SessionListener implements HttpSessionListener,
ServletRequestListener, HttpSessionActivationListener {
/** 客户端sessionid集合,多个浏览器也是可以同一终端上运行 */
public static final String clientSetkey = "clientSet";
/** 终端ip集合 */
public static final String teSetkey = "teSet";
public static final Long timelong=43200000L;
HttpServletRequest request;
@SuppressWarnings("unchecked")
@Override
public void sessionCreated(HttpSessionEvent ev) {
String sessionid = ev.getSession().getId();
String ip = request.getRemoteAddr();
Set<String> clientSet = (Set<String>) MemcacheTool.mcc.get(clientSetkey);
if (clientSet == null) {
clientSet = new HashSet<String>();
MemcacheTool.mcc.set(clientSetkey, clientSet,new Date(new Date().getTime()+timelong));
}
clientSet.add(sessionid);
MemcacheTool.mcc.set(clientSetkey, clientSet,new Date(new Date().getTime()+timelong));
Set<String> teSet = (Set<String>) MemcacheTool.mcc.get(teSetkey);
if (teSet == null) {
teSet = new HashSet<String>();
MemcacheTool.mcc.set(teSetkey, teSet,new Date(new Date().getTime()+timelong));
}
teSet.add(ip);
MemcacheTool.mcc.set(teSetkey, teSet,new Date(new Date().getTime()+timelong));
}
@SuppressWarnings("unchecked")
@Override
public void sessionDestroyed(HttpSessionEvent ev) {
String sessionid = ev.getSession().getId();
Set<String> clientSet = (Set<String>) MemcacheTool.mcc.get(clientSetkey);
if (clientSet != null && clientSet.isEmpty() == false) {
clientSet.remove(sessionid);
MemcacheTool.mcc.set(clientSetkey, clientSet,new Date(new Date().getTime()+timelong));
}
Set<String> teSet = (Set<String>) MemcacheTool.mcc.get(teSetkey);
if (teSet != null && teSet.isEmpty() == false) {
String ip = request.getRemoteAddr();
teSet.remove(ip);
MemcacheTool.mcc.set(teSetkey, teSet,new Date(new Date().getTime()+timelong));
}
MemcacheTool.mcc.delete(sessionid);
MemcacheTool.mcc.delete("menu"+sessionid);
MemcacheTool.mcc.delete("powersafecodelist"+sessionid);
}
@Override
public void sessionDidActivate(HttpSessionEvent ev) {
}
@Override
public void sessionWillPassivate(HttpSessionEvent ev) {
}
@Override
public void requestDestroyed(ServletRequestEvent ev) {
}
@Override
public void requestInitialized(ServletRequestEvent ev) {
request = (HttpServletRequest) ev.getServletRequest();
}
}