日期:2014-05-18  浏览次数:20633 次

关于限制同一用户名登录问题
我是这样限制的,写一static类,Map类,将第一个登录用户名及sessionID存在里面.当sessionID销毁时remove   Map中的sessionID及username,当刷新及关闭IE时我已捕捉到事件并相应调用销毁session方法.但是如果点击地址栏后的 "转到 "时,sessionID没被销毁,可我的Map中的数据去被remove掉了.请问有哪位高人知道是怎么回事呀.不然给个捕捉 "转到 "事件也行呀

------解决方案--------------------
千万别用数据库判断
至于转到的话我想没什么问题,如果用户已经开着IE,直接转到的话应该没什么问题,如果用户把url拷贝出来,关闭IE在进行url转到的话,你不就清了session了,然后在jsp的onload方法中判断一下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>


你可以试试.
原理是判断登陆名在服务器端是否有session,有的话就说明已经登陆了,否则就是没有登陆.

我们系统测试没有问题
------解决方案--------------------
但是如果点击地址栏后的 "转到 "时,sessionID没被销毁,可我的Map中的数据去被remove掉了.请问有哪位高人知道是怎么回事呀.不然给个捕捉 "转到 "事件也行呀

===========
对于后退的问题,你可以触发一个事件,通过javascript可以解决你的问题,就是当重新加载登陆页面时,强制页面出发一的退出系统的操作,在登陆页面加入下面代码。

<script language= "JavaScript " for= "window " event= "onload ">
LoginForm.isLogin.value= "false "; //是否登陆的标志
</script>

<script language= "JavaScript " for= "window " event= "onunload ">
if (LoginForm.isLogin.value== "false ") {
document.location= ' <%=request.getContextPath()%> /LoginAction.do?action=Logout '; //强制执行退出操作,完成清空session等相关操作
}
</script>
------解决方案--------------------