我想做一个判断用户在线的功能,要求一个帐号不能登陆2次,如果已经登陆的帐号在别的地方又登陆则禁止登陆;当一个帐号退出时,马上可以使用此帐号来登陆.一开始我是用session来判断的,可是session过时也有一定的时间啊.
关键是退出这个问题一直解决不了,因为用户有可能直接关闭浏览器.有没有什么办法可以让用户关闭浏览器时,向服务器发送消息呢?
我有试过用onunload,可是没点反应.
关键是退出这个问题一直解决不了,因为用户有可能直接关闭浏览器.有没有什么办法可以让用户关闭浏览器时,向服务器发送消息呢?
我有试过用onunload,可是没点反应.
楼主【dber1】截止到2008-07-14 21:15:22的历史汇总数据(不包括此帖):
发帖的总数量:8 发帖的总分数:420 每贴平均分数:52
回帖的总数量:32 得分贴总数量:16 回帖的得分率:50%
结贴的总数量:8 结贴的总分数:420
无满意结贴数:0 无满意结贴分:0
未结的帖子数:0 未结的总分数:0
结贴的百分比:100.00% 结分的百分比:100.00%
无满意结贴率:0.00 % 无满意结分率:0.00 %
敬礼!
问题是,你不可能判断对方是否在线除非对方登录后,每隔一定时间刷新ie(或者一个小的iframe)
下面是代码,估计看一下大概就知道。 public static int check(String termID, String userCD) { // 端末IDlogin情報取得
LoggingUserInfoBean bean = getLoggingUserInfoBean(termID); // 有取出来之后,与要login的userid进行比较
if (bean != null) {
if (!bean.getUserName().equals(userCD)) {
return CHK_NG_YOUR_LOGGING;
}
} // 指定userid有没有他人已经登陆在线判断
Set set = userList.keySet();
for (Iterator iter = set.iterator(); iter.hasNext();) {
String term = (String) iter.next();
LoggingUserInfoBean pbean = (LoggingUserInfoBean) userList.get(term);
if (pbean.getUserName().equals(userCD) && !pbean.getTerminalID().equals(termID)) {
return CHK_NG_ANOTHER_USER_LOGGING;
}
} return CHK_OK;
建议:
在数据库里面标明用户是否登陆字段(建议用Int型)
然后判断是否登陆,一旦登陆,构造新的用户session,销毁以前的session
{
}试试这个能用不
"
package demo.listener;import javax.servlet.ServletContext;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;public class SessionCounter implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent event) {
ServletContext ctx = event.getSession( ).getServletContext( );
Integer numSessions = (Integer) ctx.getAttribute("numSessions");
if (numSessions == null) {
numSessions = new Integer(1);
}
else {
int count = numSessions.intValue( );
numSessions = new Integer(count + 1);
}
ctx.setAttribute("numSessions", numSessions);
}
public void sessionDestroyed(HttpSessionEvent event) {
ServletContext ctx = event.getSession( ).getServletContext( );
Integer numSessions = (Integer) ctx.getAttribute("numSessions");
if (numSessions == null) {
numSessions = new Integer(0);
}
else {
int count = numSessions.intValue( );
numSessions = new Integer(count - 1);
}
ctx.setAttribute("numSessions", numSessions);
}
}在这个解决方案中,任何一个Session被创建或者销毁时,都会通知SessionCounter 这个类,当然通知的原因是必须在web.xml文件中做相关的配置工作。如下面的配置代码:<?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/dtd/web-app_2_3.dtd">
<web-app>
<display-name>Struts Examples</display-name><listener>
<listener-class>demo.listener.SessionCounter</listener-class>
</listener>
"
声明:思路是我的,但是代码是在网上引用的
登陆的时候判断下,该用户名在当前所有的session 会话中是否存在,如果存在就注销掉那个session,新建这个session,
如果这样不行,可以考虑 简个全局变量,里面存放用户名,与session id,通过session id 来获得对该session的操作
System.out.println("支持把它挤掉!");
invalidate到时候removeUser
用定时更新数据库某一字段来判断 或者 设置session监听器来监听用户
2.利用Map存放
3.排挤发
if (event.clientX > document.body.clientWidth && event.clientY < 0 || event.altKey) {
window.document.forms[0].submit();//这里执行的是提交退出事件操作
alert("已关闭!");
}
};
无法判断IE叉掉的时间,就无法让用户20分钟内无法登陆。
IE叉掉要是有事件,这就不是问题了。