各位tomcat&session高手,怎么获得当前所有的sessions,或者对tomcat自己的session方面的api,我能够有接口进去吗??

xixi99 2003-12-05 05:49:34
我知道在org.apache.catalina.session/ManagerBase.java中有个hashMap来管理所有的sessions,我怎么样才能取到这个hashMap??

==========================================

我的目的是处理以下问题:
当一个用户以他的唯一标志(id)进入系统,如果这时这个(id)在别的地方登陆,我将需要检测到这咱情况并写入日志!

就像msn一样,当你的帐号在别的地方登录时,msn将关闭你以前的登录连接!

==========================================

我希望能通过tomcat的session机制来实现,将(id)放进session,如果有用户登录,我就将登录(id)与之前登录的所有(id)进行比较,从而可以得出是否有重复或非法登录!
...全文
784 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
web_spider 2003-12-11
  • 打赏
  • 举报
回复
其实,内存的占用是一方面(String类型有4个int型变量和一个char[]变量,按字符串长度为5计算的话,可以占用:100K*(6×4+5)=2.9M,然后Boolean值中只有一个boolean型变量,也就是100K*4=400K,总共也就是3.3M吧,硬件虽然便宜,但是加32M的内存不一定就能弥补那3.3M的差别,我想这点大家都清楚),检索速度是另一方面。HashMap的检索速度跟数据库比较,不知道大家比较过没有?其中的速度差别有多大。
既然楼主已经用session管理的方式来管理,就试着回答楼主的两个问题吧:
非正常退出,如果只允许一个用户在线的化。用户可能只能等到那个session过期了,用户才能再次登陆。如果同时允许同一个id登陆的化,当然只需要记录日志就可以了,但这并不能反映实际情况,用户可能并没有在两个地方登陆。也正是楼主所说的“实际可能并不是冲突”“没有一个好的标准检测“。


onefox 2003-12-10
  • 打赏
  • 举报
回复
放到内存里 != 滥用session != 浪费内存

只是一个用户名(或登陆序号)与登陆状态的 键/值对

键是 String 值是 Boolean

而且更具我上面说的方法,用户登陆时才插入 一个键/值对

这样的话甚至可以省略 Boolean 值

10w用户点击率,如果每个用户 登陆/退出 都要修改数据库

可以想象这个速度一定很惊人!况且,数据库还要做其他的数据操作

还有,登陆状态是暂时的量,如果保存到数据库,

而且还要考虑系统崩溃的情况,那每次系统启动都得还原每个用户的登陆状态

就算 10w 用户都登陆, 10w 个 8~16字节的 String 对象占多少内存??

Web 服务器一般有多少内存??

如果真的不够,添一条内存可以提升速度,剩下麻烦的话……
xixi99 2003-12-10
  • 打赏
  • 举报
回复
sorry

HttpBindingLister --> HttpSessionBindingLister
xixi99 2003-12-10
  • 打赏
  • 举报
回复
谢谢两位精辟详尽的讲解

目前我已经采用session的方法,原因:
1、对数据库过多的操作将导致数据库负担过重,10w用户的点击不是一般的量,并且不是一个用户只进行一次数据库操作,包括用户的进入,退出等都需要查询、插入、更新相应字段
2、用session本身已经的机制,可以很好的控制用户退出,也就是session-timeout,并且session本身的操作很方便
3、对原来的代码不需要做太多的改动,只要在用户成功登录的地方session.setAttribute(),再写一个UserSession类就可以了,层次很清楚

采用方法:
HttpBindingLister

未解决问题:
1、用户非正常退出,比如拔网线、电源等,没有一个好的标准检测
2、如果用户在session-timeout时间之内进出,无法判断,目前只做到将冲突的用户IP写入日志,但实际可能并不是冲突。
web_spider 2003-12-10
  • 打赏
  • 举报
回复
放到内存中,会占用很多内存,从用户登陆一致到用户退出
这些信息都要保留在内存当中。Web设计有一个原则,就是尽量少
用session变量,如果非得用不成,也尽量用“小的对象”。由于
session用起来比较方便,很容易造成滥用。
而相应的一个取代方法,就是放入“持久资源"中,其中数据库就是
上佳选择。
我认为可以将是否登陆(is online)看成是用户的一个属性,
放入数据库也是理所当然的。
web_spider 2003-12-10
  • 打赏
  • 举报
回复
还是建议放数据库中,如果楼主一定要放
到session中管理,用session事件监听,可以参考下面的贴子
http://www.csdn.net/develop/Read_Article.asp?Id=15653
xixi99 2003-12-09
  • 打赏
  • 举报
回复
楼上,

我不能确定这些用户信息是放在内存中快,还是查数据库来的快
我想是不是可以将用户登录信息放在内存中的hashtable中,因为对数据库的一次操作应该是对内存操作的10速以上!
onefox 2003-12-09
  • 打赏
  • 举报
回复
放内存里是一定的,

系统启动时先制一张空表在内存里

有用户登陆时插入一条用户数据表示登陆

退出监测可能要利用一下 session (不是很熟,提个想法!)

把登陆状态直接存到数据库里速度慢,而且逻辑上就错了

登陆状态只是暂时的,没必要保存到数据库里
web_spider 2003-12-08
  • 打赏
  • 举报
回复
楼主的方法可能还不如放入数据库来作更具有效率。
只需要在查询时添加:
在user表中添加字段,例如loged,
where userID="" and password="" and loged=""
登陆成功之后,就改变loged的状态。
拥有10万的系统访问量,从session(hashtable)中,查找一个记录的效率肯定不会高,
只有数据库能负担这种访问量
yoken 2003-12-08
  • 打赏
  • 举报
回复
用session也解决不了用户非正常退出问题
xixi99 2003-12-08
  • 打赏
  • 举报
回复
楼上两位

我要做的系统可能有10w用户的点击率,所以不太想增加数据的负担
另外,利用session的好处,是因为session在用户退出后,相应的ID会自动消失,这们用数据库可能还比较麻烦,因为需要知道用户是否已经退出登录!
onefox 2003-12-05
  • 打赏
  • 举报
回复
楼上可行,但性能不好。

如果有新用户登陆,

应该先检查再连接数据库提取用户信息
whyxx 2003-12-05
  • 打赏
  • 举报
回复
我想这个也可以通过在数据库里,user表里加一个字段来实现吧,通过一个ID登录的时候要到数据库里去读相关数据,这时可以读出他现在的登录状况

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧