java web系统,禁止同一用户重复登录

BenjaminMa 发布于 2012/05/08 12:30
阅读 16K+
收藏 0

系统是用Servlet+ExtJS写的,服务器是tomcat。

现在想在系统中实现防止同一用户重复登录,当一个用户已经在系统中登录后,如果再登录就弹出提示。

目前不能在数据库中加字段来验证用户的登录状态,所在想通过在服务器上维护一个Map,key是sessionID,value是用户名。当用户成功登录后就在MAP中加入一条记录。

在用户登录时将用户名和sessionID传到判断方法,来验证是否已经存在了记录。

目前基于的理论是,不同浏览器的sessionID不同,来做唯一验证。

现在不清楚的就是,在服务器上维护的这个MAP是否会占用很大的资源,系统的平均在线用户大概在200个左右。

烦请各位有过相关经验的指正一下错误。

加载中
0
flygogo
flygogo

200个用户 能占用多少内存? 

一个sessionid 加上 用户名,每个字母占两个字节,100个也就200字节。这样1k就能有5个用户。

200个用户40k!

你这个存在一定的危险性!比如用户强制退出或者浏览器崩溃,服务器的sessionid还没有消失,这样就会在一段时间内无法登陆系统。如果session超时设的短一些,这样也会带来很多问题。

如果是用户登录踢出上个用户会好些。

flygogo
flygogo
回复 @伤离别丶 : 你说的很对!但是第一句有点问题,不是JVM说的算,而应该取决于session过时时间(如果存在非登陆页面,还要取决于这些页面是否处于活动状态)
军区文工团
军区文工团
系统什么时候回收这个session对象,是jvm说了算,监听不能保证用户非正常退出session就马上被销毁,用户不是正常退出后马上又登陆就会出现问题。
flygogo
flygogo
回复 @喵了个咪 :为什么不存在! session在一段时间内是不会失效的,如果不让登陆,所以在这段时间内就没法登陆的。
戴威
戴威
不存在这个问题,session失效的话写个监听管理
0
理工男海哥
理工男海哥

1、“在服务器上维护的这个MAP是否会占用很大的资源“这个可以写入文件,不必放在内存。

2、有一个定时机制,去判断用户是否下线,下线了清除文件记录。(discuz 好像就是这么做的,他们把上线的用户记录在表了,用来统计在线用户人数)

戴威
戴威
session本来就在内存里,占什么资源?
0
阿桂爱清净
阿桂爱清净

引用来自“徐飞”的答案

200个用户 能占用多少内存? 

一个sessionid 加上 用户名,每个字母占两个字节,100个也就200字节。这样1k就能有5个用户。

200个用户40k!

你这个存在一定的危险性!比如用户强制退出或者浏览器崩溃,服务器的sessionid还没有消失,这样就会在一段时间内无法登陆系统。如果session超时设的短一些,这样也会带来很多问题。

如果是用户登录踢出上个用户会好些。

+1
0
FoxHu
FoxHu
1.登录时,生成一个唯一的标识,然后和用户名关联。 标识保存到session或者cookie里面,用于下次访问。
2.下次访问时,判断标识与用户名关联的是否一样,如果不一样则判断重复登录了,本session自动注销。
可以重复登录,但你以前登录的无法做任何操作。
戴威
戴威
session本来就是唯一的对象
牧码氏
牧码氏
sessionid本身就是唯一的
0
xyz555
xyz555

资源占用不是问题,但问题是如果用户非正常退出你怎么处理?web无状态这点就导致不太可能严格限定。

0
戴威
戴威
直接把session放到map里,本来session就在内存里,为什么会占用资源呢?
0
强强小狮子
强强小狮子

引用来自“徐飞”的答案

200个用户 能占用多少内存? 

一个sessionid 加上 用户名,每个字母占两个字节,100个也就200字节。这样1k就能有5个用户。

200个用户40k!

你这个存在一定的危险性!比如用户强制退出或者浏览器崩溃,服务器的sessionid还没有消失,这样就会在一段时间内无法登陆系统。如果session超时设的短一些,这样也会带来很多问题。

如果是用户登录踢出上个用户会好些。

+1
0
xu81.com
xu81.com

限制重复登录不应该不允许登录,而是强制踢出之前已经登录的该用户。

0
JFinal
JFinal
服务端生成一个uuid并缓存起来,客户端用cookie保存这个uuid
0
zzuqiang
zzuqiang
lz问题解决没有?最近也在做类似的模块希望楼主能分享经验。
返回顶部
顶部