ServletContextListener 和HttpSessionListener 的自我理解
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方法。
- import javax.servlet.http.HttpSessionListener;
- import javax.servlet.http.HttpSessionEvent;
- public class SessionCounter implements HttpSessionListener {
- private static int activeSessions =0;
- /* Session创建事件 */
- public void sessionCreated(HttpSessionEvent se) {
- ServletContext ctx = event.getSession( ).getServletContext( );
- Integer numSessions = (Integer) ctx.getAttribute("numSessions");
- if (numSessions == null) {
- numSessions = new Integer(1);
- }
- else {
- int count = numSessions.intValue( );
- numSessions = new Integer(count + 1);
- }
- ctx.setAttribute("numSessions", numSessions);
- }
- /* Session失效事件 */
- public void sessionDestroyed(HttpSessionEvent se) {
- ServletContext ctx=se.getSession().getServletContext();
- Integer numSessions = (Integer)ctx.getAttribute("numSessions");
- <span class="oblog_text"> if(numSessions == null)
- numSessions = new Integer(0);
- }
- else {
- int count = numSessions.intValue( );
- numSessions = new Integer(count - 1);
- }
- ctx.setAttribute("numSessions", numSessions);</span>
- }
- }
在这个解决方案中,任何一个Session被创建或者销毁时,都会通知SessionCounter 这个类,当然通知的原因是必须在web.xml文件中做相关的配置工作。如下面的配置代码:
- <listener>
- <listener-class>demo.listener.SessionCounter</listener-class>
- </listener>
以下两种情况下就会发生sessionDestoryed(会话销毁)事件:
1.执行session.invalidate()方法时 。
既然LogoutServlet.java中执行session.invalidate()时,会触发sessionDestory()从在线用户 列表中清除当前用户,我们就不必在LogoutServlet.java中对在线列表进行操作了,所以LogoutServlet.java的内容现在是 这样。
- public void doGet(HttpServletRequest request,HttpServletResponse response)
- throws ServletException, IOException {
- // 销毁session
- request.getSession().invalidate();
- // 成功
- response.sendRedirect("index.jsp");
- }
2.
如果用户长时间没有访问服务器,超过了会话最大超时时间 ,服务器就会自动销毁超时的session。
会话超时时间可以在web.xml中进行设置,为了容易看到超时效果,我们将超时时间设置为最小值。
- <session-config>
- <session-timeout>1</session-timeout>
- </session-config>
时间单位是一分钟,并且只能是整数,如果是零或负数,那么会话就永远不会超时。
2.HttpSessionEvent
这是类代表一个web应用程序内更改会话事件通知。
- public class ShopSessionListener implements HttpSessionListener {
- public void sessionCreated(HttpSessionEvent se) {
- }
- public void sessionDestroyed(HttpSessionEvent se) {
- String sessionid = se.getSession().getId();
- EopSite site =(EopSite)ThreadContextHolder.getSessionContext().getAttribute("site_key");
- if(site!=null){
- ICartManager cartManager = SpringContextHolder.getBean("cartManager");
- cartManager.clean(sessionid,site.getUserid(),site.getId());
- }
- }
- }
se.getSession().getId();
HttpSession 接口中的getId():
Returns a string containing the unique identifier assigned to this session.
返回一个字符串,其中包含唯一标识符分配给本次会话。
ServletContextListener 和HttpSessionListener 的自我理解相关推荐
- 关于OpenGL ES 3D 光晕如何产生的自我理解
2019独角兽企业重金招聘Python工程师标准>>> 星空图的自我理解:可以看作一个透明的半径很大的天球,然后在其表面上绘制大小不一的点,这样便可以够成星空图. 如何产生光晕的自我 ...
- 关于渗透的一些思路持续更新(自我理解)
关于渗透的一些思路持续更新(自我理解) 先回忆一下 准确的是17年才接触到渗透以及ddos 其他hei产东西就不介绍了 接触的自我感觉有点迟 从最开始我也是从阿D明小子那些很傻瓜化的软件走过来的 但是 ...
- 读阿里中台战略思想有感—自我理解
读阿里中台战略思想有感-自我理解 中台的意义在于避免项目工程建设的不断"造轮子",也就是当需求来临时,全部重新建设,核心公共模块的工程代码没有被重复利用. 阿里对于中台战略思想的实 ...
- Sparsity Quantization 之自我理解
Sparsity & Quantization 之自我理解 Sparsity Quantization DNN的最初的动力是以precise为中心,但随着DNN在Edge的推广,Latency ...
- 我的python之路一初识python的自我理解
初识python的自我理解 关于python的自我简记 我认识的python 怎么开始python的学习和使用 我尝试过的几个python学习的常用组合 关于python的自我简记 初识python是 ...
- 关于三大技术革命的自我理解
我理解的这几个概念: 无线网络:无线传感器网络,通过传感器采集物理信息,将物理信息量化为数字信息,通过无线网络传递给互联网. 大数据:是一个相对的概念.对于需要分析的对象,获取足够多的信息.数据多是表 ...
- 线程和进程的自己觉得好的文章以及自我理解
(1) --关于并发 https://www.cnblogs.com/zhehan54/p/6130030.html 收获: 为什么要有多进程的多线程?? 首先现实生活中一个服务器不可能一次只服务一 ...
- 压缩感知 的自我理解
记录一下 之前看压缩感知,资料很多,千篇一律. 我总结成自己能看懂的,记录在笔记本上,供自己看,不知道自己的理解是不是完全争取,如果有不对的,还请大佬多多指出来,非常感谢. 今天累了,就不再手写了. ...
- python黑客攻防入门下载-Python键盘钩取的自我理解(来源于《Python黑客攻防入门》)...
最近从图书馆借到一本书<Python黑客攻防入门>,感觉里面的提供的代码模块对自己深有感触(主要我超菜),所以打算尝试写点小分析,希望大家能谅解本人的语言组织与技术分析. 希望有人来讨论. ...
- 自我理解的KMP 算法 模式匹配
首先,KMP最重要的是next 函数的设计,下面是next函数的原理 纯手写,可跳过不看,网上有比较抽象的理论,但是比较难以理解 下面是代码部分,重点在于 get_next 函数体 //KMP模式匹配 ...
最新文章
- YOLOv4中的tricks概念总结——Bag of freebies
- iOS 如何让IOS应用从容地崩溃
- Control.BeginInvoke 和 Delegate.BeginInvoke 备忘
- php实现工厂模式,PHP基于工厂模式实现的计算器实例
- android studio zlib,在Android Studio 3.1中构建项目时出现“压缩执行失败”错误
- java报错 日志_java 日志报错
- 解决 ImportError: No module named 'pip._internal'问题
- 「总结」 MLEAutoMaton的各种板子总结
- Python Scrapy中文教程,Scrapy框架快速入门
- LaTeX中实心圆点列表的一点经验
- 【软件需求工程】北理的恶龙们04——项目成果总结
- 完全二叉树与满二叉树的区别(有图)
- iOS-OC-3DES加密和解密
- 通俗易懂说网络之基础名词及简要介绍(1)
- php织梦,帝国,织梦CMS转帝国CMS插件
- win11--鼠标-文本选择光标变成白色
- css动画——语音播报小喇叭动效
- Java垃圾回收器(一)新生代垃圾收集器
- 使用R语言包clusterProfiler做KEGG富集分析时出现的错误及解决方法
- Latex如何去掉References前的自动标号?