日期:2014-05-20  浏览次数:20904 次

struts问题探讨(不知道低级不低级),求解决方案!
我做一个系统.struts结构.
登入时,要记录用户的登入的用户名字信息,并且不允许一个帐号同时多次登入.
在其它模块时,实时web显示在线的所有在线的用户.

原来的方法:
每个用户登入是,将其用户名放在一个静态连表中(后面模块读该表而显示在线用户)
退出时,做一个logoutaction,从该连表中清除该用户.

由于我为了"不允许一个帐号同时多次登入",在登入时先去查连表有无相同的名字(名唯一),有,则会告之用户已经存在.
这样会导致存在以下问题:
1)session过期后,没有触发logoutaction事件,静态连表中仍旧有该用户名.
再用该帐号登入时将无法登入.
2)直接断线
3)关闭按纽,关闭IE(已经解决没个页面加一个javascrip)
4)任务栏关闭IE
5)强行关闭IE进程   .时静态连表中仍旧有该用户名,导致无法登入.

且后面模块无法实时显示在线用户.


我的pl叫我查application的用法,但我看了下它也就是一个全局的东东,好象也不成.请问诸位大哥,谁有更好的方法呢?

比如根本不用静态的list... 说可以用application

谢谢,因为本人才做j2ee开发,因此经验有限...


xusihai1226@163.com

------解决方案--------------------
监听session过期,过期了就从app中删掉,意外情况(杀Ie的进程啊,关ie啊,停电啊)好像没什么办法,设个session的过期时间就可以了
------解决方案--------------------
防止同一帐户同时登陆系统的限制:

import javax.servlet.http.*;
import java.util.*;
import javax.servlet.http.HttpSession;
import *.AccountModel;

public class SessionListener implements HttpSessionListener{
private static java.util.Hashtable hUserName = new Hashtable();
public void sessionCreated(HttpSessionEvent se){
System.out.println( "Session Created. ");
}

public void sessionDestroyed(HttpSessionEvent se){
hUserName.remove(se.getSession());
System.out.println( "Session Destroyed. ");
}
/*
* isAlreadyEnter-用于判断用户是否已经登录以及相应的处理方法
* @param sUserName String-登录的用户名称
* @return boolean-该用户是否已经登录过的标志
*/
public synchronized static boolean isLogined(HttpSession session,String sUserName){
boolean flag = false;
if(hUserName.containsKey(sUserName)){
flag = true;
HttpSession vsession = (HttpSession)hUserName.get(sUserName);
try {
vsession.invalidate();
}
catch (Exception ex){}
}
else{
flag = false;
}
hUserName.remove(sUserName);
hUserName.put(sUserName,session);
return flag;
}

public synchronized static boolean isOnline(HttpSession session){
boolean flag = true;

AccountModel user = (AccountModel) session.getAttribute( "USER ");
HttpSession vsession = (HttpSession) hUserName.get(user.getMemberId());
if (session.getId().equals(vsession.getId())) {
flag = true;
} else {
flag = false;
}
return flag;

}
}

通过在login的servlet或action中的登陆方法中调用该HttpSessionListener.isLogined()方法判断是否已经登陆了,如果已经登陆,则不让登陆(踢第一个还是后面的,自己决定).

在web.xml中加入:
<listener>
<listener-class> *.SessionListener </listener-class>
</listener>