美文网首页经典好文
Java监听器中HttpSessionListener以及统计在

Java监听器中HttpSessionListener以及统计在

作者: 意识流丶 | 来源:发表于2018-11-25 23:55 被阅读13次

    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中配置监听器

    <listener>
          <listener-class>监听器类所在路径.监听器名字</listener-class>
    </listener>
    

    在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<session<application

    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以及统计在

        本文链接:https://www.haomeiwen.com/subject/tdgmqqtx.html