HttpSession监听

本文详细介绍了如何在Web应用中实现用户会话管理,并通过自定义的session监听器来实现场景下的单点登录功能。通过在session创建、销毁及属性变化时进行用户状态的检查与更新,确保了用户在不同页面间的连续性体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

在login后,向session中加入userBean

request.getSession().setAttribute("userBean", userBean);

 

 

 

1.web.xml 

<!-- 加载session监听 -->
 <listener>
  <listener-class>com.free.common.MySessionListener</listener-class>
 </listener>

 

2.MySessionListener.java

 

package com.free.common;

import java.util.*;
import java.util.Map.*;

import javax.servlet.http.*;

import com.free.pojo.*;


public class MySessionListener implements HttpSessionListener, HttpSessionAttributeListener{

 // 保存sessionID和userBean的映射 key-sessionId
 private static Map<String, TUser> userMap = new HashMap<String, TUser>();
 private static Map<String, HttpSession> sessionMap = new HashMap<String, HttpSession>();

 public MySessionListener(){

 }

 /** 以下是实现HttpSessionListener中的方法 **/
 public void sessionCreated(HttpSessionEvent se) {
  
 }

 public void sessionDestroyed(HttpSessionEvent se) {
  String sessionId = se.getSession().getId();
  TUser userBean = (TUser) se.getSession().getAttribute(Common.CONSTANT_USER);
  if(null == userBean){
   return;
  }
  String username = userBean.getUsername();
  userMap.remove(username);
  sessionMap.remove(sessionId);
 }

 /** 以下是实现HttpSessionAttributeListener中的方法 **/
 public void attributeAdded(HttpSessionBindingEvent se) {
  if(Common.CONSTANT_USER.equals(se.getName())) {
   TUser userBean = (TUser) se.getSession().getAttribute(Common.CONSTANT_USER);
   String sessionId = se.getSession().getId();
   String username = userBean.getUsername();
   userBean.setSessionId(sessionId);
   
   /**
    * 踢掉已经存在的用户
    */
   TUser ub1 = userMap.get(username);// 已经存在的用户
   if(null != ub1 && ub1.getUsername().equals(userBean.getUsername())){
    singleLogin(ub1.getId());
   }
   
   userMap.put(username, userBean);
   sessionMap.put(sessionId, se.getSession());
  }
 }

 public void attributeRemoved(HttpSessionBindingEvent se) {
  
 }

 public void attributeReplaced(HttpSessionBindingEvent se) {
  
 }

 /**
  * 描述:singleLogin 单点登录-踢掉之前的用户
  * @CreateOn Jul 26, 2011  9:20:04 PM
  * @author chun_chang
  */
 public static void singleLogin(String userId) {
  clearUserById(userId);
 }
 
 /**
  * 描述:clearUserById 清空同一在线用户的session
  * @param userId
  * @CreateOn Jul 25, 2011  11:05:44 AM
  * @author chun_chang
  */
 public static void clearUserById(String userId) {
  Map<String, TUser> tempMap = new HashMap<String, TUser>();
  tempMap.putAll(userMap);
  Iterator<Entry<String, TUser>> iter = tempMap.entrySet().iterator();
  while(iter.hasNext()) {
   Map.Entry<String, TUser> entry = (Map.Entry<String, TUser>) iter.next();
   TUser userBean = entry.getValue();
   if(userId.equals(userBean.getId())) {
    String sessionId = userBean.getSessionId();
    HttpSession session = sessionMap.get(sessionId);
    session.removeAttribute(Common.CONSTANT_USER);
    session.invalidate();
    sessionMap.remove(sessionId);
   }
  }
 }
 
 
}

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值