将登陆用户对象放到一个static HashMap中,登陆的时候检查该MAP中是否有同名的USERNAME
放出实现代码
import java.util.*;
import javax.servlet.http.*;
public class OnlineUser implements HttpSessionListener,java.io.Serializable{
private static ReadWriteLock lock=new ReadWriteLock();
private static HashMap name_session = new HashMap();
private static HashMap UserMap = new HashMap();
public static int getUserCount(){
lock.acquireReadLock();
try{
return UserMap.size();
}finally{
lock.releaseReadLock();
}
}
public static UserForm getUser(String sessionID){
lock.acquireReadLock();
try{
return (UserForm)UserMap.get(sessionID);
}finally{
lock.releaseReadLock();
}
}
public static void addUser(String sessionID,UserForm user){
lock.acquireWriteLock();
try{
//先删除前面一次登陆的该用户对象
UserMap.remove(name_session.get(user.getLOGINNAME()));
name_session.remove(user.getLOGINNAME());
//再添加新的用户
UserMap.put(sessionID,user);
name_session.put(user.getLOGINNAME(),sessionID);
}finally{
lock.releaseWriteLock();
}
}
public static void addUser(HttpSession session,UserForm user){
lock.acquireWriteLock();
try{
//先删除前面一次登陆的该用户对象
UserMap.remove(name_session.get(user.getLOGINNAME()));
name_session.remove(user.getLOGINNAME());
//再添加新的用户
UserMap.put(session.getId(),user);
name_session.put(user.getLOGINNAME(),session.getId());
}finally{
lock.releaseWriteLock();
}
}
public static boolean existUserByLoginName(String LOGINNAME){
lock.acquireReadLock();
try{
return name_session.containsKey(LOGINNAME);
}finally{
lock.releaseReadLock();
}
}
public static boolean existUserBySessionID(String sessionID){
lock.acquireReadLock();
try{
return UserMap.containsKey(sessionID);
}finally{
lock.releaseReadLock();
}
}
public static void deleteUser(String sessionID){
lock.acquireWriteLock();
try{
name_session.remove(UserMap.get(sessionID));
UserMap.remove(sessionID);
}finally{
lock.releaseWriteLock();
}
}
public static void deleteUserByLOGINNAME(String LOGINNAME){
lock.acquireWriteLock();
try{
UserMap.remove(name_session.get(LOGINNAME));
name_session.remove(LOGINNAME);
}finally{
lock.releaseWriteLock();
}
}
public static boolean SessionExist(HttpSession session){
lock.acquireReadLock();
try{
return UserMap.containsKey(session.getId());
}finally{
lock.releaseReadLock();
}
}
public void sessionCreated(HttpSessionEvent se){
System.out.println(se.getSession().getId()+" 登入到系统 "+new Date());
}
public void sessionDestroyed(HttpSessionEvent se){
lock.acquireWriteLock();
try{
name_session.remove(UserMap.get(se.getSession().getId()));
UserMap.remove(se.getSession().getId());
}finally{
lock.releaseWriteLock();
}
System.out.println(se.getSession().getId()+" 退出系统 "+new Date());
}
public static Iterator userMap(){
lock.acquireReadLock();
try{
return UserMap.values().iterator();
}finally{
lock.releaseReadLock();
}
}
}
下面是同步锁
public class ReadWriteLock{
private int readers=0; //读线程计数器
private boolean writingInProgress = false; //写操作标记
private boolean waitingWriter = false; //等待写操作的标记
public ReadWriteLock(){ }
public synchronized void acquireReadLock(){
while(writingInProgress||waitingWriter==true){
try{
wait();
}catch (InterruptedException ie) { /* ignore */ }
}
readers++;
}
public synchronized void releaseReadLock(){
readers--;
if (readers == 0) { //没有人在读操作,通知可能等待着的写操作线程
//notify();
notifyAll();
}
}
public synchronized void acquireWriteLock(){
while(readers>0||writingInProgress){
try{
waitingWriter = true;
wait();
}catch(InterruptedException ie){ /* ignore */ }
}
writingInProgress = true;
waitingWriter = false;
}
public synchronized void releaseWriteLock(){
writingInProgress = false;
notifyAll();
}
}