美文网首页经典好文
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以及统计在

    HttpSession session就是一系列某用户和服务器间的通讯。服务器有能力分辨出不同的用户,一个sess...

  • 二、HttpSessionListener

    一、HttpSessionListener 在WEB应用中,当一个session被创建或者销毁时启用这个监听器。关...

  • Java监听器中ServletContextListener以及

    ServletContext ServletContext 被 Servlet 程序用来与 Web 容器通信。例如...

  • Java Web 之监听器

    前言 学一学Java Web 三大组件之一监听器。 Servlet监听器 监听器主要用来监听事件的创建和销毁以及属...

  • Java web监听器Listener初步了解

    什么是java监听器? java监听器,也叫做Listener,是Servlet的监听器。它可以监听客户端的请求,...

  • Listener

    java web三大组件:servlet,listener,filter。java web中的监听器 事件源:三大...

  • JavaWeb Listener

    Java Web开发中,监听器常用与监听HttpServletRequest、HttpSession和Servle...

  • java lambda 表达式

    我们为什么需要Lambda表达式主要有三个原因: 更加紧凑的代码比如Java中现有的匿名内部类以及监听器(list...

  • tomcat内存马Listener篇

    什么是监听器 监听器类型 java共有三种类型的监听器 ServletContext对象的监听器 它能够监听 Se...

  • javaweb 监听器

    1. java web中监听器的阐述 Listener是Servlet的监听器,它可以监听客户端的请求,服务端的操...

网友评论

    本文标题:Java监听器中HttpSessionListener以及统计在

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