Session监听

1、监听类:

package com.bigdatalearning.utils;

import java.util.HashMap;
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 org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.bigdatalearning.entity.CourseEntity;
import com.bigdatalearning.entity.UserEntity;

public class SessionListener implements HttpSessionListener, HttpSessionAttributeListener {
  
    private final static Log log = LogFactory.getLog(SessionListener.class);  
  
    // 保存当前登录的所有用户  
    public static Map<String, HttpSession> loginUser = new HashMap<String, HttpSession>();  
  
    // 用这个作为session中的key  
    public static String SESSION_LOGIN_NAME = "user";  
  
    // 执行setAttribute的时候, 当这个属性本来不存在于Session中时, 调用这个方法.  
    @Override  
    public void attributeAdded(HttpSessionBindingEvent se) {  
  
        // 如果添加的属性是用户名, 则加入map中  
        if (se.getName().equals(SESSION_LOGIN_NAME)) {  
        	UserEntity u = (UserEntity) se.getValue();  
            HttpSession session = loginUser.remove(u.getUser_name());  
            if (session != null) {  
                session.removeAttribute("user");  
            }  
            loginUser.put(u.getUser_name(), se.getSession());  
        }  
    }  
  
    // 当执行removeAttribute时调用的方法  
    @Override  
    public void attributeRemoved(HttpSessionBindingEvent se) {  
        // 如果移除的属性是用户名, 则从map中移除  
        if (se.getName().equals(SESSION_LOGIN_NAME)) {  
            try {  
            	UserEntity u = (UserEntity) se.getValue();  
                loginUser.remove(u.getUser_name());  
            } catch (Exception e) {  
                log.debug(e);  
            }  
        }  
    }  
  
    // 当执行setAttribute时 ,如果这个属性已经存在, 覆盖属性的时候, 调用这个方法  
    @Override  
    public void attributeReplaced(HttpSessionBindingEvent se) {  
        // 如果改变的属性是用户名, 则跟着改变map  
        if (se.getName().equals(SESSION_LOGIN_NAME)) {  
        	UserEntity u = (UserEntity) se.getValue();  
            HttpSession session = loginUser.remove(u.getUser_name());  
            /*if (session != null) { 
                session.removeAttribute("user"); 
            }*/  
            loginUser.put(u.getUser_name(), se.getSession());  
        }  
    }  
  
    // session创建时调用这个方法  
    @Override  
    public void sessionCreated(HttpSessionEvent se) {  
        log.debug("SessionListener........session创建-----"  
                + se.getSession().getId());  
    }  
  
    // Session失效或者过期的时候调用的这个方法,  
    @Override  
    public void sessionDestroyed(HttpSessionEvent se) {  
        // 如果session超时, 则从map中移除这个用户  
        try {  
        	UserEntity u = (UserEntity) se.getSession().getAttribute("user");  
            loginUser.remove(u.getUser_name());  
        } catch (Exception e) {  
            log.debug(e);  
        }  
    } 
}


2、web.xml配置:

	<session-config>    
    	<session-timeout>30</session-timeout>      
	</session-config>
		
	<listener>
		<listener-class> com.bigdatalearning.utils.SessionListener</listener-class>
	</listener>


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值