springboot 用监听器统计在线人数案例分析

 更新时间:2018年02月07日 11:16:14   作者:JavaWeb大牛  
这篇文章主要介绍了springboot 用监听器统计在线人数案例分析,质是统计session 的数量,思路很简单,具体实例代码大家参考下本文

本文在springboot 的项目,用HttpSessionListener 监听器(监听器的其中一种) 统计在线人数,实质是统计session 的数量。

 思路很简单,但是有个细节没处理好,让我调试了大半天,才把bug搞好。

 先写个HttpSessionListener 监听器。count  是session的数量(人数),session 创建的时候,会触发监听器的sessionCreated 方法,session销毁的时候,会触发监听器的sessionDestroyed 方法。 在监听器中计算完人数count,把他放进servletContext(可以理解为一个仓库,任意请求可以存储和获取里面的属性)。
 注意监听器加上@WebListener,这样就不用配置。

@WebListener 
public class OnLineCount implements HttpSessionListener { 
  public int count=0;//记录session的数量 
  //监听session的创建,synchronized 防并发bug 
  public synchronized void sessionCreated(HttpSessionEvent arg0) { 
    System.out.println("【HttpSessionListener监听器】count++ 增加"); 
    count++; 
    arg0.getSession().getServletContext().setAttribute("count", count); 
  } 
  @Override 
  public synchronized void sessionDestroyed(HttpSessionEvent arg0) {//监听session的撤销 
    System.out.println("【HttpSessionListener监听器】count-- 减少"); 
    count--; 
    arg0.getSession().getServletContext().setAttribute("count", count); 
  } 
} 

接着写一个查询session 数量的controller,我开始的时候是像下面这样写的,是错误的!

从servletContext 中取出count ,把count返回前端。

@RequestMapping("/count") 
@ResponseBody 
public String count(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse){ 
  Object count=httpServletRequest.getServletContext().getAttribute("count"); 
  return "count : "+count; 
} 

这样是错误的,测试你会发现,页面看到count  是null ,因为没有创建session,没有触发监听器的统计方法。于是改一下:

@Controller 
public class IndexController { 
  @RequestMapping("/count") 
  @ResponseBody 
  public String count(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse){ 
    HttpSession session = httpServletRequest.getSession(); 
    Object count=session.getServletContext().getAttribute("count"); 
    return "count : "+count; 
  } 
} 

 HttpSession session = httpServletRequest.getSession();  作用:该用户如果没有sesision则创建session ,有则取得session不创建。

 改成这样测试,看起来是对的,但是有个问题。一个浏览器对应一个session,你打开2个浏览器,看到count是2 ,是对的。但是你关了一个浏览器,再打开,应该是2不变才对,但是变成3 了,原因是session销毁的方法没有执行,重新打开时,服务器找不到用户原来的session ,重新创建了一个session,于是有3个session了,但是浏览器只有2个,也就是模拟应该是只有2个人在线上。 

有2个方法可以解决这个问题,一个是在关闭网页的时候,前端去调用一个方法把session销毁。另一个更好的方法是,让服务器记得原来那个session,即把原来的sessionId 记录在浏览器,下次打开时,把这个sessionId发送过去,这样服务器就不会重新创建。

代码修改如下:

@Controller 
public class IndexController { 
  @RequestMapping("/count") 
  @ResponseBody 
  public String number(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse){ 
    try{ //把sessionId记录在浏览器 
      Cookie c = new Cookie("JSESSIONID", URLEncoder.encode(httpServletRequest.getSession().getId(), "utf-8")); 
      c.setPath("/"); 
      //先设置cookie有效期为2天,不用担心,session不会保存2天 
      c.setMaxAge( 48*60 * 60); 
      httpServletResponse.addCookie(c); 
    }catch (Exception e){ 
      e.printStackTrace(); 
    } 
    HttpSession session = httpServletRequest.getSession(); 
    Object count=session.getServletContext().getAttribute("count"); 
    return "count : "+count; 
  } 
} 

总结

以上所述是小编给大家介绍的springboot 用监听器统计在线人数案例分析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • java验证码生成的基本流程

    java验证码生成的基本流程

    这篇文章主要介绍了java验证码生成的基本流程,需要的朋友可以参考下
    2015-11-11
  • 前端存token后端获取token代码实例(Spring Boot)

    前端存token后端获取token代码实例(Spring Boot)

    Token其实就是访问资源的凭证,一般是用户通过用户名和密码登录成功之后,服务器将登陆凭证做数字签名,加密之后得到的字符串作为token,这篇文章主要给大家介绍了关于前端存token,Spring Boot后端获取token的相关资料,需要的朋友可以参考下
    2024-07-07
  • Spring中的Lifecycle接口使用与源码分析

    Spring中的Lifecycle接口使用与源码分析

    这篇文章主要介绍了Spring中的Lifecycle接口使用与源码分析,LifeCycle接口定义了Spring容器的生命周期,任何被Spring管理的对象都可以实现该接口,需要的朋友可以参考下
    2023-05-05
  • mybatis的动态sql之if test的使用说明

    mybatis的动态sql之if test的使用说明

    这篇文章主要介绍了mybatis的动态sql之if test的使用说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • Java反射机制详解

    Java反射机制详解

    Java的反射机制是在运行状态中,对于任何一个类,都可以知道这个类的所有属性和方法,对于任何一个对象,都可以调用它所有的方法和属性,修改部分类型信息,这种动态获取信息以及动态调用对象方法的功能称为Java的反射机制
    2022-09-09
  • 详解使用spring aop实现业务层mysql 读写分离

    详解使用spring aop实现业务层mysql 读写分离

    本篇文章主要介绍了使用spring aop实现业务层mysql 读写分离,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • SpringBoot启动失败的原因及其解决方法

    SpringBoot启动失败的原因及其解决方法

    对于springboot的启动失败,相信大家都有经历,但是为什么会启动失败,以及怎么解决都只能通过日志进行查看,在这里,我会将常见的springboot启动失败的报错一一展示,需要的朋友可以参考下
    2024-06-06
  • IDEA 非常重要的一些设置项(一连串的问题差点让我重新用回 Eclipse)

    IDEA 非常重要的一些设置项(一连串的问题差点让我重新用回 Eclipse)

    这篇文章主要介绍了IDEA 非常重要的一些设置项(一连串的问题差点让我重新用回 Eclipse),本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • 详解如何在SpringBoot中优雅地重试调用第三方API

    详解如何在SpringBoot中优雅地重试调用第三方API

    在实际的应用中,我们经常需要调用第三方API来获取数据或执行某些操作,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-12-12
  • 解决SpringBoot项目中log4j与logback的Jar包冲突问题

    解决SpringBoot项目中log4j与logback的Jar包冲突问题

    这篇文章主要给大家介绍了解决SpringBoot项目中log4j与logback的Jar包冲突问题,文中有详细的解决方法和冲突的原因,有遇到相同问题的朋友可以参考阅读本文
    2023-10-10

最新评论