1.

总结一下tomcat 服务器里的三种监听

ServletContextListener

HttpSessionListener

ServletRequestListener

这是我要做的三个自定义重写 类 分别继承上面三个接口

2具体源码

(1) ServletContextListener

用于监听服务器的启动与关闭

 1 package cn.cen2guo.clinic.listener;
2
3
4 import javax.servlet.ServletContextEvent;
5 import javax.servlet.ServletContextListener;
6
7
8 /**
9 * 用于监听服务器的启动与关闭
10 */
11 public class MyServletContextListener implements ServletContextListener {
12 @Override
13 public void contextInitialized(ServletContextEvent sce) {
14 // System.out.println("创建ServletContext对象");
15 }
16
17 @Override
18 public void contextDestroyed(ServletContextEvent sce) {
19 // System.out.println("销毁ServletContext对象");
20 }
21 }

MyServletContextListener

(2) HttpSessionListener

用于监听session的创建与销毁

 1 package cn.cen2guo.clinic.listener;
2
3
4 import javax.servlet.http.HttpSessionEvent;
5 import javax.servlet.http.HttpSessionListener;
6
7 /**
8 * 用于监听session的创建于销毁,目前没啥用处
9 */
10
11 public class MyHttpSessionListener implements HttpSessionListener {
12
13 @Override
14 public void sessionCreated(HttpSessionEvent se) {
15 // System.out.println("session 被创建了");
16 // System.out.println(se.getSession().getId());
17 }
18
19 @Override
20 public void sessionDestroyed(HttpSessionEvent se) {
21 // System.out.println("session 被销毁了");
22 // System.out.println(se.getSession().getId());
23 // System.out.println("销毁结束");
24 }
25
26
27 }

MyHttpSessionListener

(3)ServletRequestListener

用于监听每一次请求 的开始【初始化】 与结束【销毁】

package cn.cen2guo.clinic.listener;

import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener; /**
* 用于监听每一次请求,
*/
//使用注解@WebListener 和 @Component ,则不需要去web.xml文件里注册监听 ,
//同时spring扫面也不需要特意设定可以扫描到这里 ,但是仍然可以识别,这就很舒服了
//@WebListener
//@Component
public class MyServletRequestListener implements ServletRequestListener { @Override
public void requestInitialized(ServletRequestEvent sre) {
// System.out.println("requestInitialized 初始化");
} @Override
public void requestDestroyed(ServletRequestEvent sre) {
// System.out.println("requestDestroyed 销毁");
} }

MyServletRequestListener

3.  注册监听有两种,任意一种都可以:

  方法一:使用spring注解

  

  方法二 : 去web.xml文件注册监听标签

4.心得

(1) 服务器开启,servletcontextListener首先被使用。servletcontext被创建了;

服务器关闭的前一刻才会触发其销毁监听内容

(2)  网页向controller请求,ServletRequestListener 首先检测出来,
执行了他的requestInitialized 方法,即初始化request;等待contronller事务结束后,才出发servletRequestListener的销毁事件

(3)并不是每次前端向服务器请求 都会 验证要不要创建Session  ,而是当服务器调用了HttpServletRequest.getSession(true) 后,

才会创建一个服务器内独一无二的session会话  ,其session id 则是自动分配一个无序的字符串,[得到两个一样的几率非常低]

然后才保存在前端[一般在cookie里面]。

(4)session 可以设置存活时间,到期后自动注销 ,但往往都是默认值,每当前端浏览器关闭后,session才开始以默认期限倒计时,

等待时间到后才销毁,并不是浏览器一关闭,就会销立马销毁 ,当然,也没必要手动对其销毁,让其自毁自灭就行,

根据这一特性,就无法让服务器判断前端用户是否仍在,想要实现这个功能,只能使用websocket 或者长轮询,长轮询太消耗资源了,不建议使用,

websocket则是最好的方式!!!

(5) 从Tomcat设置的cookie路径来看,它对不同的应用程序设置的cookie路径是不同的,这样不同的应用程序所用的session id是不同的,因此即使在

同一个浏览器窗口里访问不同的应用程序,发送给服务器的session id也可以是不同的。

tomcat 服务器的几个重要监听 方法 与 使用的更多相关文章

  1. 简述Java中Http/Https请求监听方法

    一.工欲善其事必先利其器 做Web开发的人总免不了与Http/Https请求打交道,很多时候我们都希望能够直观的的看到我们发送的请求参数和服务器返回的响应信息,这个时候就需要借助于某些工具啦.本文将采 ...

  2. jquery 事件监听方法

    一.事件监听方法 mouseover()   鼠标移入事件方法 mouseout()    鼠标移出事件方法 mouseenter()  鼠标移入事件方法 mouseleave()  鼠标移出事件方法 ...

  3. Unity3D热更新之LuaFramework篇[04]--自定义UI监听方法

    时隔一个多月我又回来啦! 坚持真的是很难的一件事,其它事情稍忙,就很容易说服自己把写博客的计划给推迟了. 好在终于克服了自己的惰性,今天又开始了. 本篇继续我的Luaframework学习之路. 一. ...

  4. 重启服务器后,启动oracle监听报错 The listener supports no services The command completed successfuslly

    启动监听报错如下图所示: 远程连接报错如下图所示: 问题原因:数据库实例没注册到listener中 解决方法: (1)登录数据库:$sqlplus  / as sysdba (2)显示服务名:sql& ...

  5. 后台自动运行,定期记录定位数据(Hbuilder监听 app由前台切换到后台、切换运行环境的 监听方法)

    http://ask.dcloud.net.cn/question/28090 https://blog.csdn.net/qq_37508970/article/details/86649703 各 ...

  6. jquery 监听常用监听方法

    最近在做网站开发,需要用到不少js的知识.之前学过现在重新来看,发现还真忘了不少~~ 在使用基于bootstrap,或者基于 jquery 的插件时,如过没有出现预期效果 请最先检查下是否优先载入的 ...

  7. Android View中的控件和监听方法...

    PS:居然三天没写博客了...今天补上...东西虽多,但是都是一些基础...代码多了一些,有人可能会这样问,粘这么多代码有毛用..其实对于一个Android的初学者来说,一个完整的代码是最容易帮助理解 ...

  8. AngularJS路由变化 监听方法

    #使用AngularJS时,当路由发生改变时,我们需要做某些处理,此时可以监听路由事件,常用的是$routeStartChange, $routeChangeSuccess ##使用场景:在路由配置文 ...

  9. Android修行之路------List view无法获取监听方法

    注意: 1.在list view自定义布局中如果添加滚动布局,会导致自定义布局无法获取监听. 2.如果ListView的每项布局里有像Button,ImageButton之类View的控键时,这些Vi ...

随机推荐

  1. socket通道

    一.socket 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. 就是两个进程,跨计算机,他俩需要通讯的话,需要通过网络对接起来.这就是 socket 的作 ...

  2. shell脚本 screen管理

    一.简介 源码地址 日期:2018/4/12 介绍:使用screen来启动程序,这个脚本可以管理screen 效果图: 二.使用 适用:centos6+ 语言:中文 注意:请先写一个脚本来启动java ...

  3. .gitignore文件作用

    目录 一.简介 二.常用规则 三.详细 一.简介 一般来说每个Git项目中都需要一个.gitignore文件,这个文件的作用就是告诉Git哪些文件不需要添加到版本管理中. 意思就是本地修改完项目后,上 ...

  4. 从零开始写一个前端脚手架四、初始化进程提示(chalk)

    我们之前说过bin里面的index.js文件是作为入口文件存在的.实际上的初始化内容在.action里面操作的,为了方便管理,我们把实际操作的代码抽出来放一块儿管理 创建指令文件 在根目录创建一个co ...

  5. 【antd】如何自定义antd组件form表单中Form.Item里的内容组件

    需求:现有一个form表单,但是其中一个元素比较复杂,并不是简单的输入框或者下拉框之类的.但是我又希望能通过form.validateFields().then()去获得它的值,就不需要在当前页面写大 ...

  6. HCNP Routing&Switching之组播技术-组播协议IGMP

    前文我们了解了组播地址相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15616740.html:今天我们来聊一聊组播协议中IGMP协议相关话题: 组播 ...

  7. js实现数组去重的方式(7种)

    JS数组去重的方式 例:将下面数组去除重复元素(以多种数据类型为例) const arr = [1, 2, 2, 'abc', 'abc', true, true, false, false, und ...

  8. .NET 云原生架构师训练营(系统架构)--学习笔记

    目录 对外展现的功能 内部功能 功能交互与价值通路 系统架构 目标 认识系统的价值通路 认识功能架构,通过把功能结构与形式结构结合来描述系统架构 受益原则 好的架构必须使人受益,要想把架构做好,就要专 ...

  9. CF1099A Snowball 题解

    Content 有一个重量为 \(w\) 的雪球从高度为 \(h\) 的位置开始滚落,每秒它的高度会减少 \(1\),同时在高度为 \(i\) 的位置它的重量会增加 \(i\).在雪球滚动的路线上还有 ...

  10. CF1036D Vasya and Arrays 题解

    Content 给定两个长度分别为 \(n\) 和 \(m\) 的数列 \(A,B\).你需要将两个数列都恰好分成 \(k\) 份,使得两个数列中第 \(i(i\in[1,k])\) 份的元素和对应相 ...