如果用户不多,可以这样做:
做一个全局的用户管理器,假设用户第一次登录(或者注销后登录),管理器当中是没有用户信息的,管理器就把这个用户的相关信息记录下来(比如sessionId,最后登录时间)。
假设用户再次登录,管理器就比较用户信息。如果用户的sessionId一致,说明用户未注销又再次登录,那么就提示他先注销。如果用户的sessionId不一致,说明用户换了机器或者关闭了浏览器,那么就用现在的信息替代原先的信息。记得让以前的session失效。
做一个全局的用户管理器,假设用户第一次登录(或者注销后登录),管理器当中是没有用户信息的,管理器就把这个用户的相关信息记录下来(比如sessionId,最后登录时间)。
假设用户再次登录,管理器就比较用户信息。如果用户的sessionId一致,说明用户未注销又再次登录,那么就提示他先注销。如果用户的sessionId不一致,说明用户换了机器或者关闭了浏览器,那么就用现在的信息替代原先的信息。记得让以前的session失效。
解决方案 »
- 关于SSH整合的问题
- 在sun主页下载的j2ee附带glassfish使用中的问题
- hibernate如何实现与distinct有关的分页查询
- 用<s:iterator>标签从action中的list显示出来的数据怎样再通过set方法返回到action页面中?
- 问个菜鸟问题,如果把long类型的变量赋值给Object对象?
- 如何在保留tomcat的情况下安装weblogic?
- struts的一个简单例子不能运行!!!!
- 关于AccessControlException的
- 源码求救!在线等候
- 谁能提供,J BUILDER8.0的教材,高分相赠,
- 【急】java Struts2 根据文件路径可以上传附件吗?
- jdom处理xml文档过滤了留换行符~?
1、用户的登陆信息保存在session中。
登陆时先根据用户名去查找session的,如果该用户名的session存在,就说明该用户已经登
陆了,此时你可以定制自己的登陆规则,是优先原则或者是后者优先原则即可以。
2、在数据的用户帐户表中加如个状态字段,比如0表示已经登陆,1表示没有登陆,只要帐户一登陆系统就设置标志位值为1,退出时则置为0上面说的两种方法都存在一些问题,,比如表加状态位,当不正当退出的时候,怎么去恢复状态位,必须要解决,否则出现这种情况之后该帐户就被锁定了。最好的方法是两种方法结合一起使用
用户每次登录时,都要到context里查找是否有相关信息,有则提示登陆失败。
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();
}
}
while(writingInProgress||waitingWriter==true){
try{
wait();
}catch (InterruptedException ie) { /* ignore */ }
}
readers++;
}
不先notifyAll就wait要死锁的
每次用户登录之前先判断下Application里是否有这个ID就好
采用 回复人:asklxf(xuefeng) ( 五级(中级)) 信誉:94
应该更明智点
以前遇到过这样的需求,后来还是给delete掉了
除了session过期。 似乎没更好的办法。
除非你在客户端用ActiveX 或者是 Applet
不好意思,开始没注意看,您说的对,谢了
结帐了