ServletContextListener

当Servlet 容器启动或终止Web 应用时,会触发ServletContextEvent 事件,该事件由ServletContextListener 来处理。在 ServletContextListener 接口中定义了处理ServletContextEvent 事件的两个方法。

l  contextInitialized(ServletContextEvent sce) :当Servlet 容器启动Web 应用时调用该方法。在调用完该方法之后,容器再对Filter 初始化,并且对那些在Web 应用启动时就需要被初始化的Servlet进行初始化。

l  contextDestroyed(ServletContextEvent sce) :当Servlet 容器终止Web 应用时调用该方法。在调用该方法之前,容器会先销毁所有的Servlet 和Filter 过滤器。

当tomcat启动时进入contextInitialized方法进行一些初始化的操作,如获得数据库的相关信息,当tomcat关闭时进入contextDestroyed方法此时当tomcat服务器关闭时contextDestroyed()方法确实走了,你认为它没走,我估计是你用了eclipse或者是myeclipse来开启和关闭tomcat了吧,这是控制台是不显示内容的,不要通不过这些软件来开启和关闭,而是你找到你安装tomcat的目录下,点击开启或关闭tomcat命令,这样你就看见其实走了contextDestroyed这个方法。

HttpSessionListener

Session创建事件发生在每次一个新的session创建的时候,类似地Session失效事件发生在每次一个Session失效的时候。

这个接口也只包含两个方法,分别对应于Session的创建和失效:
# public void sessionCreated(HttpSessionEvent se); 
# public void sessionDestroyed(HttpSessionEvent se);

我的web应用上想知道到底有多少用户在使用?

在网站中经常需要进行在线人数的统计。过去的一般做法是结合登录和退出功能,即当用户输入用户名密码进行登录的时候计数器加1,然后当用户点击退出按钮退出系统的时候计数器减1。这种处理方式存在一些缺点,例如:用户正常登录后,可能会忘记点击退出按钮,而直接关闭浏览器,导致计数器减1的操作没有及时执行;网站上还经常有一些内容是不需要登录就可以访问的,在这种情况下也无法使用上面的方法进行在线人数统计。
  我们可以利用Servlet规范中定义的事件监听器(Listener)来解决这个问题,实现更准确的在线人数统计功能。对每一个正在访问的用户,J2EE应用服务器会为其建立一个对应的HttpSession对象。当一个浏览器第一次访问网站的时候,J2EE应用服务器会新建一个HttpSession对象 ,并触发 HttpSession创建事件 ,如果注册了HttpSessionListener事件监听器,则会调用HttpSessionListener事件监听器的sessionCreated方法。相反,当这个浏览器访问结束超时的时候,J2EE应用服务器会销毁相应的HttpSession对象,触发 HttpSession销毁事件,同时调用所注册HttpSessionListener事件监听器的sessionDestroyed方法。

Java代码  
  1. import javax.servlet.http.HttpSessionListener;
  2. import javax.servlet.http.HttpSessionEvent;
  3. public class SessionCounter implements HttpSessionListener {
  4. private static int activeSessions =0;
  5. /* Session创建事件 */
  6. public void sessionCreated(HttpSessionEvent se) {
  7. ServletContext ctx = event.getSession( ).getServletContext( );
  8. Integer numSessions = (Integer) ctx.getAttribute("numSessions");
  9. if (numSessions == null) {
  10. numSessions = new Integer(1);
  11. }
  12. else {
  13. int count = numSessions.intValue( );
  14. numSessions = new Integer(count + 1);
  15. }
  16. ctx.setAttribute("numSessions", numSessions);
  17. }
  18. /* Session失效事件 */
  19. public void sessionDestroyed(HttpSessionEvent se) {
  20. ServletContext ctx=se.getSession().getServletContext();
  21. Integer numSessions = (Integer)ctx.getAttribute("numSessions");
  22. <span class="oblog_text">        if(numSessions == null)
  23. numSessions = new Integer(0);
  24. }
  25. else {
  26. int count = numSessions.intValue( );
  27. numSessions = new Integer(count - 1);
  28. }
  29. ctx.setAttribute("numSessions", numSessions);</span>
  30. }
  31. }

在这个解决方案中,任何一个Session被创建或者销毁时,都会通知SessionCounter 这个类,当然通知的原因是必须在web.xml文件中做相关的配置工作。如下面的配置代码:

Java代码  
  1. <listener>
  2. <listener-class>demo.listener.SessionCounter</listener-class>
  3. </listener>

以下两种情况下就会发生sessionDestoryed(会话销毁)事件:
   1.执行session.invalidate()方法时 。
      既然LogoutServlet.java中执行session.invalidate()时,会触发sessionDestory()从在线用户 列表中清除当前用户,我们就不必在LogoutServlet.java中对在线列表进行操作了,所以LogoutServlet.java的内容现在是 这样。

Java代码  
  1. public void doGet(HttpServletRequest request,HttpServletResponse response)
  2. throws ServletException, IOException {
  3. // 销毁session
  4. request.getSession().invalidate();
  5. // 成功
  6. response.sendRedirect("index.jsp");
  7. }

2.
      如果用户长时间没有访问服务器,超过了会话最大超时时间 ,服务器就会自动销毁超时的session。
      会话超时时间可以在web.xml中进行设置,为了容易看到超时效果,我们将超时时间设置为最小值。

Java代码  
  1. <session-config>
  2. <session-timeout>1</session-timeout>
  3. </session-config>

时间单位是一分钟,并且只能是整数,如果是零或负数,那么会话就永远不会超时。

2.HttpSessionEvent

这是类代表一个web应用程序内更改会话事件通知。

Java代码  
  1. public class ShopSessionListener implements HttpSessionListener {
  2. public void sessionCreated(HttpSessionEvent se) {
  3. }
  4. public void sessionDestroyed(HttpSessionEvent se) {
  5. String sessionid = se.getSession().getId();
  6. EopSite site  =(EopSite)ThreadContextHolder.getSessionContext().getAttribute("site_key");
  7. if(site!=null){
  8. ICartManager cartManager = SpringContextHolder.getBean("cartManager");
  9. cartManager.clean(sessionid,site.getUserid(),site.getId());
  10. }
  11. }
  12. }

se.getSession().getId();

HttpSession 接口中的getId():

Returns a string containing the unique identifier assigned to this session.

返回一个字符串,其中包含唯一标识符分配给本次会话。

ServletContextListener 和HttpSessionListener 的自我理解相关推荐

  1. 关于OpenGL ES 3D 光晕如何产生的自我理解

    2019独角兽企业重金招聘Python工程师标准>>> 星空图的自我理解:可以看作一个透明的半径很大的天球,然后在其表面上绘制大小不一的点,这样便可以够成星空图. 如何产生光晕的自我 ...

  2. 关于渗透的一些思路持续更新(自我理解)

    关于渗透的一些思路持续更新(自我理解) 先回忆一下 准确的是17年才接触到渗透以及ddos 其他hei产东西就不介绍了 接触的自我感觉有点迟 从最开始我也是从阿D明小子那些很傻瓜化的软件走过来的 但是 ...

  3. 读阿里中台战略思想有感—自我理解

    读阿里中台战略思想有感-自我理解 中台的意义在于避免项目工程建设的不断"造轮子",也就是当需求来临时,全部重新建设,核心公共模块的工程代码没有被重复利用. 阿里对于中台战略思想的实 ...

  4. Sparsity Quantization 之自我理解

    Sparsity & Quantization 之自我理解 Sparsity Quantization DNN的最初的动力是以precise为中心,但随着DNN在Edge的推广,Latency ...

  5. 我的python之路一初识python的自我理解

    初识python的自我理解 关于python的自我简记 我认识的python 怎么开始python的学习和使用 我尝试过的几个python学习的常用组合 关于python的自我简记 初识python是 ...

  6. 关于三大技术革命的自我理解

    我理解的这几个概念: 无线网络:无线传感器网络,通过传感器采集物理信息,将物理信息量化为数字信息,通过无线网络传递给互联网. 大数据:是一个相对的概念.对于需要分析的对象,获取足够多的信息.数据多是表 ...

  7. 线程和进程的自己觉得好的文章以及自我理解

    (1)  --关于并发 https://www.cnblogs.com/zhehan54/p/6130030.html 收获: 为什么要有多进程的多线程?? 首先现实生活中一个服务器不可能一次只服务一 ...

  8. 压缩感知 的自我理解

    记录一下 之前看压缩感知,资料很多,千篇一律. 我总结成自己能看懂的,记录在笔记本上,供自己看,不知道自己的理解是不是完全争取,如果有不对的,还请大佬多多指出来,非常感谢. 今天累了,就不再手写了. ...

  9. python黑客攻防入门下载-Python键盘钩取的自我理解(来源于《Python黑客攻防入门》)...

    最近从图书馆借到一本书<Python黑客攻防入门>,感觉里面的提供的代码模块对自己深有感触(主要我超菜),所以打算尝试写点小分析,希望大家能谅解本人的语言组织与技术分析. 希望有人来讨论. ...

  10. 自我理解的KMP 算法 模式匹配

    首先,KMP最重要的是next 函数的设计,下面是next函数的原理 纯手写,可跳过不看,网上有比较抽象的理论,但是比较难以理解 下面是代码部分,重点在于 get_next 函数体 //KMP模式匹配 ...

最新文章

  1. YOLOv4中的tricks概念总结——Bag of freebies
  2. iOS 如何让IOS应用从容地崩溃
  3. Control.BeginInvoke 和 Delegate.BeginInvoke 备忘
  4. php实现工厂模式,PHP基于工厂模式实现的计算器实例
  5. android studio zlib,在Android Studio 3.1中构建项目时出现“压缩执行失败”错误
  6. java报错 日志_java 日志报错
  7. 解决 ImportError: No module named 'pip._internal'问题
  8. 「总结」 MLEAutoMaton的各种板子总结
  9. Python Scrapy中文教程,Scrapy框架快速入门
  10. LaTeX中实心圆点列表的一点经验
  11. 【软件需求工程】北理的恶龙们04——项目成果总结
  12. 完全二叉树与满二叉树的区别(有图)
  13. iOS-OC-3DES加密和解密
  14. 通俗易懂说网络之基础名词及简要介绍(1)
  15. php织梦,帝国,织梦CMS转帝国CMS插件
  16. win11--鼠标-文本选择光标变成白色
  17. css动画——语音播报小喇叭动效
  18. Java垃圾回收器(一)新生代垃圾收集器
  19. 使用R语言包clusterProfiler做KEGG富集分析时出现的错误及解决方法
  20. Latex如何去掉References前的自动标号?

热门文章

  1. 移动开发:怎么去掉点击时出现背景蓝色
  2. wsdl2java工具生成客户端代码
  3. 游戏开发中的数学和物理算法(18):缩放
  4. 谈谈R中的乱码(二)
  5. 关于模块问题的折磨(from sys import argv),之后的解决
  6. 常见的几种负载均衡技术
  7. 洛谷 P1881 绳子对折
  8. bzoj 2179: FFT快速傅立叶 -- FFT
  9. JUnit-三角形判断测试
  10. LSOF 安装与使用