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

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

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

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

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

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

我希望能通过tomcat的session机制来实现,将(id)放进session,如果有用户登录,我就将登录(id)与之前登录的所有(id)进行比较,从而可以得出是否有重复或非法登录!
...全文
283 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
xixi99 2003-12-10
  • 打赏
  • 举报
回复
谢谢两位精辟详尽的讲解

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

采用方法:
HttpSessionBindingLister

未解决问题:
1、用户非正常退出,比如拔网线、电源等,没有一个好的标准检测
2、如果用户在session-timeout时间之内进出,无法判断,目前只做到将冲突的用户IP写入日志,但实际可能并不是冲突。
wuyg719 2003-12-09
  • 打赏
  • 举报
回复
解决思路可以开阔一些:
(1)直接放在一个Static Vector中,每次都去找一下
(2)直接放在数据库中,每次都去搜一下
(3)在servlet老的规范里有取得全部Session的方法,可惜已经停用了,因为安全理由
xixi99 2003-12-09
  • 打赏
  • 举报
回复
楼上,你这代码应该有可行性

可是我试了一下,没有发现在什么时候会调用valueUnbound()呀
也就是用户退出没有执行valueUnbound,为什么会这样??
hykwolf 2003-12-08
  • 打赏
  • 举报
回复
application.setAttribute("userID",userID_arrayList_And_IP);
ArrayList userID=(ArrayList)application.getAttribute("userID");

if(new_login_userID 包含于userID){
you can do any.
}else{
userID.add(new_login_userID+" split_char "+login_IP);
application.setAttribute("userID",userID);
}
试试用application对象来实现可能方便一些
foolfish 2003-12-08
  • 打赏
  • 举报
回复
gz
可以实现吗 - -
色老虫 2003-12-08
  • 打赏
  • 举报
回复
我帮你顶~~~~>_<"
xixi99 2003-12-08
  • 打赏
  • 举报
回复
楼上几位:

HttpSession好像是针对一次会话的,也就是只针对某个用户的,而我是想得到所有用户的ID,这样好像不行吧,
麻烦指条明路!
youandi79 2003-12-08
  • 打赏
  • 举报
回复
package bean.sample ;

import java.util.*;
import javax.servlet.http.*;
/**
*用户登陆成功时:
*session.setAttribute("users",new UserSession(username));
*/

public class UserSession implements HttpSessionBindingListener
{

private String userName;

public UserSession(String username)
{
this.userName=username;
}

public void valueBound(HttpSessionBindingEvent e)
{
Properties sys=System.getProperties();

int online;
try {online=((Integer)sys.get("online")).intValue();}
catch(Exception ex) {online=0;}
online++;
sys.put("online",new Integer(online));

ArrayList users=(ArrayList)sys.get("users");
if(users==null)
users = new ArrayList();
users.add(this.userName);
sys.put("users",users);

System.setProperties(sys);
}

public void valueUnbound(HttpSessionBindingEvent e)
{
Properties sys=System.getProperties();

int online;
try {online=((Integer)sys.get("online")).intValue();}
catch(Exception ex) {online=0;}
online--;
if(online<0) online=0;
sys.put("online",new Integer(online));

ArrayList users=(ArrayList)sys.get("users");
users.remove(this.userName);
sys.put("users",users);

System.setProperties(sys);
}

}
youandi79 2003-12-07
  • 打赏
  • 举报
回复
HttpSessionBindingListener
showerXP 2003-12-07
  • 打赏
  • 举报
回复
session.getAttributeNames()获得该会话的所有对象的名字。
kindani 2003-12-07
  • 打赏
  • 举报
回复
看servler specification

81,092

社区成员

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

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