没有伞就要努力奔跑
2016-07-26 08:37
采纳率: 7.4%
浏览 3.6k
已采纳

Session统计用户在线数量问题

谁有思路,求大神
HttpSession session=arg0.getSession();
ServletContext application=session.getServletContext();

    //在application范围有一个HshSet集保存所有的Session
    HashSet sessions= (HashSet) application.getAttribute("sessions");
    if(sessions != null){
        sessions=new HashSet();
        application.setAttribute("sessions", sessions);
    }
    //新创建的session均添加到HashSet集中
    sessions.add(session);
    System.out.println("当前在线人数:"+sessions.size());
    这样报空指针
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

6条回答 默认 最新

  • little_how 2016-07-26 09:24
    已采纳

    if(sessions != null){
    sessions=new HashSet();
    application.setAttribute("sessions", sessions);
    }
    这个逻辑判断有问题,应该是sessions == null才进行初始化。
    所以改成
    if(sessions == null){
    sessions=new HashSet();
    application.setAttribute("sessions", sessions);
    }
    这样就不会出现空指针了
    希望能够帮到你

    打赏 评论
  • 付博瀚 2016-07-26 08:59

    分配一个session你+1

    打赏 评论
  • GreenRookie 2016-07-26 09:14

    int sum=0;
    if(sessions != null){
    sessions=new HashSet();
    application.setAttribute("sessions", sessions);
    sum++;
    }
    syso(sum);

    打赏 评论
  • xlb_123 2016-07-26 09:19

    我有一个js统计方可人数的,是用cookie写的,地址:http://blog.csdn.net/qq736150416/article/details/51799389可以看下

    打赏 评论
  • 喵小鹿 2017-09-16 10:23

    今天刚好做了这个在线统计用户人数的项目,就在此将思路说一下,献丑了。。。。
    理清楚三个问题:
    1、用户人数这个变量userNumber应存储在哪?
    这个用户人数的变量userNumber应存储到application域对象的属性当中,因为从web应用程序开启时就应该进行用户人数统计直到该web应用停止
    或重启
    2、什么时候人数加1?
    创建一个类继承HttpSessionListener并实现其两个方法sessionCreated()和sessionDestroyed(),当用户访问服务器时,Servlet容器此时会开启一个线程并调用sessionCreate方法,在这个方法中让变量userNumber加1并将其添加到application域对象属性当中
    3、什么时候人数减1?
    当用户退出访问该web应用程序时,会立即调用和sessionDestroyed(),此时在这个方法中让变量userNumber减1并将其添加到application域对象属性当中

    示例代码如下:

    @WebListener("统计用户在线人数")

    public class MyHttpSessionListener implements HttpSessionListener {

    private int userNumber = 0;  // 用户在线人数
    
    @Override
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
        userNumber++;  // 人数加1
        httpSessionEvent.getSession().getServletContext().setAttribute("userNumber", userNumber);  // 将userNumber添加到application域对象属性当中
    }
    
    @Override
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
        userNumber--; // 人数减1
        httpSessionEvent.getSession().getServletContext().setAttribute("userNumber", userNumber);  // 再次将userNumber添加到application域对象的属性当中
    
    }
    

    }

    统计在线用户及数量这个功能的作用:
    1、通过在线用户统计功能,可以知道该网站用户的访问情况和使用情况,进而得知该网站受欢迎的程度和宣传效果好不好。
    2、对于应用平台而言,可以考核使用人员的日常使用情况

    打赏 评论
  • 大-鱼 2019-03-29 10:01

    线程安全么。。。你这个number是共享的啊

    打赏 评论

相关推荐 更多相似问题