发现对于登录问题的解决都说用session监听,但是没有人写出示例代码,今天写了一个,希望对大家有所帮助. 解决同名用户登录的问题,类似QQ,即同名用户第二次登录,第一次登录的用户就掉线. SessionListener.java监听session的类,部署于/App/WEB-INF/classes/com/test下(其中App为你的应用程序目录) package com.test; import javax.servlet.http.*; import java.util.*; public class SessionListener implements HttpSessionListener{ private static HashMap hUserName = new HashMap();//保存sessionID和username的映射 /**以下是实现HttpSessionListener中的方法**/ public void sessionCreated(HttpSessionEvent se){ } public void sessionDestroyed(HttpSessionEvent se){ hUserName.remove( se.getSession().getId() ); } /* * isAlreadyEnter-用于判断用户是否已经登录以及相应的处理方法 * @param sUserName String-登录的用户名称 * @return boolean-该用户是否已经登录过的标志 */ public static boolean isAlreadyEnter(HttpSession session,String sUserName){ boolean flag = false; if(hUserName.containsValue(sUserName)){//如果该用户已经登录过,则使上次登录的用户掉线(依据使用户名是否在hUserName中) flag = true; //遍历原来的hUserName,删除原用户名对应的sessionID(即删除原来的sessionID和username) Iterator iter = hUserName.entrySet().iterator(); while (iter.hasNext()) { Map.Entry entry = (Map.Entry)iter.next(); Object key = entry.getKey(); Object val = entry.getValue(); if( ( (String)val ).equals(sUserName) ){ hUserName.remove(key); } } hUserName.put( session.getId(),sUserName );//添加现在的sessionID和username System.out.println("hUserName = " + hUserName); } else{//如果该用户没登录过,直接添加现在的sessionID和username flag = false; hUserName.put( session.getId(),sUserName ); System.out.println("hUserName = " + hUserName); } return flag; } /* * isOnline-用于判断用户是否在线 * @param session HttpSession-登录的用户名称 * @return boolean-该用户是否在线的标志 */ public static boolean isOnline(HttpSession session){ boolean flag = true; if( hUserName.containsKey( session.getId() ) ){ flag = true; } else{ flag = false; } return flag; } } web.xml部署于/App/WEB-INF下 <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/j2ee/dtds/web-app_2.3.dtd"> <web-app> <listener> <listener-class> com.inspirer.dbmp.SessionListener </listener-class> </listener> </web-app> 应用部分 1.在你的登录验证时,调用SessionListener.isAlreadyEnter(session,"admin") 既可以判断该用户名的用户是否登录过,又可以使上次登录的用户掉线 2.其他页面调用SessionListener.isOnline(session),可以判断该用户是否在线.

|