Java监听器中HttpSessionListener以及统计在线人数

HttpSession

session就是一系列某用户和服务器间的通讯。服务器有能力分辨出不同的用户,
一个session的建立是从一个用户向服务器发第一个请求开始,而以用户显式结束或session超时为结束。

工作原理:

1.当一个用户向服务器发送第一个请求时,服务器为其建立一个session
并为此session创建一个标识号
2.这个用户随后的所有请求都应包括这个标识号。服务器会校对这个标识号以判断请求属于哪个session

这种机制不使用IP作为标识,是因为很多机器是通过代理服务器方式上网,没法区分每一台机器。
对于session标识号sessionIDsession的实现主要两种方式:cookie(首选默认)与url重写

具体分析可以参考
https://blog.csdn.net/championhengyi/article/details/72855552

HttpSessionListener

HttpSessionListener定义的两个方法:sessionCreated()sessionDestroyed()
这两个方法可以监听到当前应用中session的创建和销毁情况

主要用于统计在线人数和记录访问日志,记录访问时间、访问的ip

一个HttpSession可以注册多个HttpSessionListener接口,
一个web应用中可以有多个HttpSession对象

HttpSessionListener源码

public interface HttpSessionListener extends EventListener {
    default void sessionCreated(HttpSessionEvent se) {
    }
    default void sessionDestroyed(HttpSessionEvent se) {
    }
}

HttpSessionListener监听器实现代码

非SpringBoot下

public class OnLineCount implements HttpSessionListener{
    private final Logger log = LoggerFactory.getLogger(getClass());
    static int count=0;
    @Override
    public synchronized void sessionCreated(HttpSessionEvent se) {
        count++;
        se.getSession().getServletContext().setAttribute("count", count);
        log.info("count++  增加");
    }
    @Override
    public synchronized void sessionDestroyed(HttpSessionEvent se) {
        count--;
        se.getSession().getServletContext().setAttribute("count", count);
        log.info("count--  减少");
    }
}

然后在web.xml中配置监听器


      监听器类所在路径.监听器名字

在SpringBoot中需要加上@WebListener

@WebListener
public class OnLineCount implements HttpSessionListener{
    private final Logger log = LoggerFactory.getLogger(getClass());
    static int count=0;
    @Override
    public synchronized void sessionCreated(HttpSessionEvent se) {
        count++;
        se.getSession().getServletContext().setAttribute("count", count);
        log.info("count++  增加");
    }
    @Override
    public synchronized void sessionDestroyed(HttpSessionEvent se) {
        count--;
        se.getSession().getServletContext().setAttribute("count", count);
        log.info("count--  减少");
    }
}

需要在启动类加上@ServletComponentScan
说明:
1.getSession().getServletContext().setAttribute() 设置上下文的session对象
2.这里用synchronized防止并发,但是推荐使用int的原子类实现++操作,可参考https://www.jianshu.com/p/f9fea6295db8

controller层演示用户登录

@RestController
public class IndexController {
    @RequestMapping("/count")
    public String count(HttpServletRequest httpServletRequest){
        HttpSession session = httpServletRequest.getSession();
        return "count : "+session.getServletContext().getAttribute("count");
    }
}

httpServletRequest.getSession()从请求中提取HttpSession对象,如果没有自动创建
session.getServletContext().getAttribute()取出上下文的session对象,也就是登录人数

关于session相关参数设置,都可以在application.yml配置文件中配置

配置session超时时间(默认30分钟)

server:
  servlet:
    session:
      timeout: 60m

启动测试

访问http://localhost:8080/count

image.png

同一电脑中
在同一浏览器无论打开多少次都是同一个session
在不同浏览器打开才会产生不同的session

Session(HttpSession)

服务器会为每个会话创建一个session对象,所以session中的数据可供当前会话中所有servlet共享。
会话:用户打开浏览器会话开始,直到关闭浏览器会话才会结束。一次会话期间只会创建一个session对象。
作用域:request

HttpSession具体方法和使用可参考官方文档:
https://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/http/HttpSession.html

深入了解HttpSession可以参考
https://www.cnblogs.com/shenbing/p/5372717.html

你可能感兴趣的:(Java监听器中HttpSessionListener以及统计在线人数)