一个账号只能登录一次??

现在有这样的一个需求:一个账号只能登录一次,如果登录两次,后者把前者踢掉。但问题就出现了,如果我第二个用户登录后(踢掉第一个用户),并非按照正常流程去注销session的话(浏览器关闭等)session在其有效期内还是有效的,这就意味着我再次登录的话会有一个标识说明我已经登录了这个问题怎么解决?

我是这样做的,但是有以上的问题:
1.我把这个每个用户的账号(不唯一)+编号(唯一)作为我全局变量(ServletContext)的key,value为当前sessionID
当另一个用户登录的时候,同样保存,在过滤器中去ServletContext中的sessionID和当前sessionID比较,不同说明是第一个用户,相同时第二个用户,这样就可以踢掉第一个用户。
2.在用户注销的时候(将session、保存在ServletContext中的变量一同移除)

问题就出现在第二步,并不是所有的用户都会去注销,如果用户不注销的话,我的全局变量中保存的值没有办法移除,同一个账号再次登录的话就会出现”已经登录“的情况(在session没有失效前)。

我用HttpSessionListener,但是sessionDestroyed执行有前提1.调用session.invalidate() 2.session失效
哎,我不能等到session失效吧,即使我能等,当时我不能保证用户会等呀,该怎么办呀,在线急等??

2010年12月01日 10:07 "shangwangwuzui1988"的内容
现在有这样的一个需求:一个账号只能登录一次,如果登录两次,后者把前者踢掉。但问题就出现了,如果我第二个用户登录后(踢掉第一个用户),并非按照正常流程去注销session的话(浏览器关闭等)session在其有效期内还是有效的,这就意味着我再 ...


登录前,用interceptor,ContextCleanUp一下,不就OK了么,为什么你要搞得那么复杂?

2010年12月01日 10:35 "lqtcts"的内容
登录前,用interceptor,ContextCleanUp一下,不就OK了么,为什么你要搞得那么复杂? ...

没用过,能具体说说思路吗?

2010年12月01日 10:40 "shangwangwuzui1988"的内容
没用过,能具体说说思路吗? ...

对不起,刚才理解错了,原来你想踢掉前一位用户,关掉浏览器对吧?

这个并不难,用AJAX很容易实现的,因为session里的key是你的账号,重复登陆后原来的session被覆盖掉,原来用户会话过期。现在你要做的是,发送消息给浏览器,告诉它关闭。用AJAX实现,应该很容易的。

2010年12月01日 11:20 "lqtcts"的内容
现在你要做的是,发送消息给浏览器,告诉它关闭 ...

我从网上也看到了一个事件,是在点击X号的事件,但问题是怎么解决我非正常关闭浏览器,如重启,Alt+F4等等。。

2010年12月01日 11:39 "shangwangwuzui1988"的内容
我从网上也看到了一个事件,是在点击X号的事件,但问题是怎么解决我非正常关闭浏览器,如重启,Alt+F4等等。。 ...


在我印象里,js,有关闭浏览器的方法啊,好像是windows.close();

表示关注!

问题真不怎么看懂-。-

帐号不唯一?

同样保存,保存后还能使用过滤器?是提交后过滤的意思吧?

还有这句“在过滤器中去ServletContext中的sessionID和当前sessionID比较”怎么读···

还有是既然你的机制是第二个会T掉第一个,第一个不注销session,就当他没断开过啊,当作T掉处理不行?

A有账户p1,B有账户p2

A在电脑c1上用p1登陆,然后C一会儿用p1在电脑c2上登陆。。然后把A踢掉?


- -!这样处理不行吧?

2010年12月02日 02:15 "SpeedVan"的内容
帐号不唯一?

同样保存,保存后还能使用过滤器?是提交后过滤的意思吧?
还有这句“在过滤器中去ServletContext中的sessionID和当前sessionID比较”怎么读···
还有是既然你的机制是第二个会T掉第一 ...

这样说吧,加入用户为企业,注册时候是以企业的身份注册的,企业用户登录后可以创建自己的管理员,在一个企业中管理员是不能重复的,但是有N多个企业(注册企业账号不能重名),但每个企业下都有管理员,所以不能只凭借账号来判断。
“在过滤器中去ServletContext中的sessionID和当前sessionID比较”中“去”是“获取" ,嘿嘿,打错字了。

主要的问题不是怎么踢人,而是我非正常Logout的话,有些代码就被绕过,必须等session失效后通过监听器来重新执行该操作。但是我不能等到失效期来临,因为在这个过程中用户可能还会登录,这是会给用户提示已经有一个用户,实际上没有,只是上一次用户退出时没有移除

帐号是唯一,你说的那个状况,忽视了公司帐号。帐号是为了确认身份而存在的,也就是具有唯一性。

company1.admin
company1.user1
company1.user2

这为前缀式(帐号)登录;

先登录公司,再登录个人

此为层式登录。

前序式帐号登录就像一般登录了。
层式登录,注意“帐号不唯一”的说法是有误的,需要注意“场景”,先登录公司就像先进入场景,也就是公司间是相互独立,各自帐号不具有可比性,也就是不存在“帐号不唯一”的说法。若果从整个系统出发,个人帐号,应该跟前缀式帐号一样,是公司帐号和公司个人帐号的结合——正个系统个人帐号=公司帐号+公司个人帐号,所以这样看“帐号也是唯一”的。

至于你说的状况,主要是由于session驻留的问题吧,也就是session有效期问题了。设置快一些不就得了?