web.xml
<listener>
<listener-class>com.iflytek.atp.web.listener.SessionListener</listener-class>
</listener>
SessionListener类:
package com.iflytek.atp.web.listener;
import java.util.Hashtable;
import java.util.Map;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import com.iflytek.atp.redis.REDIS;
public class SessionListener implements HttpSessionListener,
HttpSessionAttributeListener {
// 保存当前redis中所有登录用户的HttpSession:redisKey
public static Map<HttpSession, String> redisKey = new Hashtable<HttpSession, String>();
// Session失效或者过期的时候调用的这个方法,
@Override
public void sessionDestroyed(HttpSessionEvent se) {
// 如果session超时, 则从map中移除这个用户
try {
if (redisKey.containsKey(se.getSession())) {
String[] token_accountId = redisKey.get(se.getSession()).split(";");
String token = token_accountId[0];
String accountId = token_accountId[1];
if(REDIS.exists(token)){//token
// 如果redis中存在,则删除
REDIS.remove(token);//token
}
if (REDIS.exists(accountId)) {//accountId
// 如果redis中存在,则删除
REDIS.remove(accountId);//accountId
}
redisKey.remove(se.getSession());
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* session创建的时候
* @param arg0
*/
@Override
public void sessionCreated(HttpSessionEvent arg0) {
}
@Override
public void attributeAdded(HttpSessionBindingEvent arg0) {
}
@Override
public void attributeReplaced(HttpSessionBindingEvent arg0) {
}
@Override
public void attributeRemoved(HttpSessionBindingEvent arg0) {
}
}
HttpSessionListener有2个接口需要实现
sessionCreated//新建一个会话时候触发也可以说是客户端第一次和服务器交互时候触发
sessionDestroyed//销毁会话的时候 一般来说只有某个按钮触发进行销毁 或者配置定时销毁
HttpSessionAttributeListener有3个接口需要实现
attributeAdded//在session中添加对象时触发此操作 笼统的说就是调用setAttribute这个方法时候会触发的
attributeRemoved//修改、删除session中添加对象时触发此操作 笼统的说就是调用 removeAttribute这个方法时候会触发的
attributeReplaced//在Session属性被重新设置时