java统计在线人数问题

c00000007 2014-06-24 03:45:24
代码已实现,问题是:为什么每次打开login.jsp 就执行了 sessionCreated() , 而不是登陆成功之后执行。


具体代码实现如下:


public class UserSessionListener implements HttpSessionListener {

@SuppressWarnings("rawtypes")
@Override
public void sessionCreated(HttpSessionEvent event) {
// TODO Auto-generated method stub

HttpSession session = event.getSession();

ServletContext application = session.getServletContext();

// 在application范围由一个HashSet集保存所有的session
HashSet sessions = (HashSet) application.getAttribute("sessions");
if (sessions == null) {
sessions = new HashSet();
application.setAttribute("sessions", sessions);
}

// 新创建的session均添加到HashSet集中
sessions.add(session);
// 可以在别处从application范围中取出sessions集合
// 然后使用sessions.size()获取当前活动的session数,即为“在线人数”
System.out.println("session-------"+sessions.size());

}

@SuppressWarnings("rawtypes")
@Override
public void sessionDestroyed(HttpSessionEvent event) {
// TODO Auto-generated method stub
HttpSession session = event.getSession();
ServletContext application = session.getServletContext();

HashSet sessions = (HashSet) application.getAttribute("sessions");
synchronized (this) {

// 销毁的session均从HashSet集中移除
sessions.remove(session);
}
System.out.println("session remove-------"+sessions.size());

}

}



web.xml 中设置如下


<!-- online user -->
<listener>
<listener-class>*.UserSessionListener</listener-class>
</listener>


各位大神,求解决!!!
...全文
380 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
中华雪碧 2014-06-25
  • 打赏
  • 举报
回复
引用 6 楼 c00000007 的回复:
[quote=引用 5 楼 gagewang1 的回复:] [quote=引用 3 楼 c00000007 的回复:] [quote=引用 2 楼 LJ_liujue 的回复:] 取session 或者是cookie 。 或者你根据访问的ip来判断也行
这个应该是即时获取的吧,获取ip和这个方法没什么区别,现在的问题是为什么打开login.jsp却创建了session,是那里写的不对吗[/quote]打开login。jsp创建session不对吗?你要的是在线人数还是登陆的人数?[/quote] 登陆过的人,打开login.jsp 的时候还没有登陆,是这个方法的问题吗?[/quote]在listen类 加一个HashMap变量来存放已登录的用户
yanghongjy 2014-06-25
  • 打赏
  • 举报
回复
登录用 application 退出清除登录人数 关闭浏览器用定时来进行检索处理
姜小白- 2014-06-25
  • 打赏
  • 举报
回复
引用 13 楼 c00000007 的回复:
在退出时调用session.invalidate();就会清除session的,不需要等到session超时, 但是我的项目是 退出的时候返回到登陆界面,这样做,就是在删除session之后,就又创建了一个,等同于没有起效
有效果的,清除的是当前登录人的session,你退出后再登陆时,进去的就是新的session。 每次登录时,系统会去判断当前用户有没有登陆,没有的话将会话放进session。 每次登录时,系统会重新去数据库查询当前用户的信息的,这也是为什么很多网站新注册的用户,让重新登陆的原因。
c00000007 2014-06-25
  • 打赏
  • 举报
回复
引用 11 楼 xiangyuecn 的回复:
打开了session,默认情况下是首次访问就会自动创建session对象,并往客户端写入cookie,因此一打开页面就触发了事件。 要登录时才创建session,要把所有jsp页面的session关闭 <%@page ... session="false" ...%> 然后登录成功后手动调用pageContext.getSession()获取session对象,这时才会创建session。 不过其他页面也要手动调用获取session对象,用起来不是很方便,而且导致没登陆的用户不可以用session功能,setAttribute都不能用了。 还有哇,正常情况下sessionDestroyed要等到超时了才会触发的,比如session设置了20分钟,然后就要傻傻的等上20分钟才会调用。 结论:用session来统计不合适
在退出时调用session.invalidate();就会清除session的,不需要等到session超时, 但是我的项目是 退出的时候返回到登陆界面,这样做,就是在删除session之后,就又创建了一个,等同于没有起效
乔不思 2014-06-24
  • 打赏
  • 举报
回复
这个一般用的是 application 来统计,因为application对应的类是 运行环境的上下文,比session精确,这个不推荐用session
高坚果兄弟 2014-06-24
  • 打赏
  • 举报
回复
打开了session,默认情况下是首次访问就会自动创建session对象,并往客户端写入cookie,因此一打开页面就触发了事件。 要登录时才创建session,要把所有jsp页面的session关闭 <%@page ... session="false" ...%> 然后登录成功后手动调用pageContext.getSession()获取session对象,这时才会创建session。 不过其他页面也要手动调用获取session对象,用起来不是很方便,而且导致没登陆的用户不可以用session功能,setAttribute都不能用了。 还有哇,正常情况下sessionDestroyed要等到超时了才会触发的,比如session设置了20分钟,然后就要傻傻的等上20分钟才会调用。 结论:用session来统计不合适
c00000007 2014-06-24
  • 打赏
  • 举报
回复
引用 9 楼 wxhlqcl2010 的回复:
在前端页面写个ajax定时请求一下,如果不存在将判断为离线。
不是很懂你的意思,这个监听器本来就是根据用户在线离线来改变个数的
北风之神096 2014-06-24
  • 打赏
  • 举报
回复
在前端页面写个ajax定时请求一下,如果不存在将判断为离线。
c00000007 2014-06-24
  • 打赏
  • 举报
回复
引用 7 楼 LJ_liujue 的回复:
[quote=引用 6 楼 c00000007 的回复:] [quote=引用 5 楼 gagewang1 的回复:] [quote=引用 3 楼 c00000007 的回复:] [quote=引用 2 楼 LJ_liujue 的回复:] 取session 或者是cookie 。 或者你根据访问的ip来判断也行
这个应该是即时获取的吧,获取ip和这个方法没什么区别,现在的问题是为什么打开login.jsp却创建了session,是那里写的不对吗[/quote]打开login。jsp创建session不对吗?你要的是在线人数还是登陆的人数?[/quote] 登陆过的人,打开login.jsp 的时候还没有登陆,是这个方法的问题吗?[/quote] 拦截器,判断是否登陆过,登陆过则计数[/quote] 我就是想在登陆之后再执行,不知道要如何着手,写的有拦截器,但这个 sessionCreated 是在拦截器之前执行的
LJ_liujue 2014-06-24
  • 打赏
  • 举报
回复
引用 6 楼 c00000007 的回复:
[quote=引用 5 楼 gagewang1 的回复:] [quote=引用 3 楼 c00000007 的回复:] [quote=引用 2 楼 LJ_liujue 的回复:] 取session 或者是cookie 。 或者你根据访问的ip来判断也行
这个应该是即时获取的吧,获取ip和这个方法没什么区别,现在的问题是为什么打开login.jsp却创建了session,是那里写的不对吗[/quote]打开login。jsp创建session不对吗?你要的是在线人数还是登陆的人数?[/quote] 登陆过的人,打开login.jsp 的时候还没有登陆,是这个方法的问题吗?[/quote] 拦截器,判断是否登陆过,登陆过则计数
c00000007 2014-06-24
  • 打赏
  • 举报
回复
引用 5 楼 gagewang1 的回复:
[quote=引用 3 楼 c00000007 的回复:] [quote=引用 2 楼 LJ_liujue 的回复:] 取session 或者是cookie 。 或者你根据访问的ip来判断也行
这个应该是即时获取的吧,获取ip和这个方法没什么区别,现在的问题是为什么打开login.jsp却创建了session,是那里写的不对吗[/quote]打开login。jsp创建session不对吗?你要的是在线人数还是登陆的人数?[/quote] 登陆过的人,打开login.jsp 的时候还没有登陆,是这个方法的问题吗?
中华雪碧 2014-06-24
  • 打赏
  • 举报
回复
引用 3 楼 c00000007 的回复:
[quote=引用 2 楼 LJ_liujue 的回复:] 取session 或者是cookie 。 或者你根据访问的ip来判断也行
这个应该是即时获取的吧,获取ip和这个方法没什么区别,现在的问题是为什么打开login.jsp却创建了session,是那里写的不对吗[/quote]打开login。jsp创建session不对吗?你要的是在线人数还是登陆的人数?
proteinboy 2014-06-24
  • 打赏
  • 举报
回复
在java web规范中说明.按照 listener,filter,servlet 的顺序初始化.
c00000007 2014-06-24
  • 打赏
  • 举报
回复
引用 2 楼 LJ_liujue 的回复:
取session 或者是cookie 。 或者你根据访问的ip来判断也行
这个应该是即时获取的吧,获取ip和这个方法没什么区别,现在的问题是为什么打开login.jsp却创建了session,是那里写的不对吗
LJ_liujue 2014-06-24
  • 打赏
  • 举报
回复
取session 或者是cookie 。 或者你根据访问的ip来判断也行
LJ_liujue 2014-06-24
  • 打赏
  • 举报
回复
去session 或者是cookie

81,094

社区成员

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

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