JavaWeb 三大组件之监听器 Listener
一、Listener 监听器介绍
1.1 Listener 监听器介绍
- Listener 监听器它是 JavaWeb 的三大组件之一。JavaWeb 的三大组件分别是:Servlet 程序、Listener 监听器、Filter 过滤器
- Listener 是 JavaEE 的规范,就是接口
- 监听器的作用是,监听某种变化(一般就是对象创建/销毁, 属性变化), 触发对应方法完成相应的任务
- JavaWeb 中的监听器(共八个), 目前最常用的是 ServletContextListener
二、JavaWeb 的监听器
2.1 ServletContextListener 监听器
-
作用:监听 ServletContext 创建或销毁(当我们 Web 应用启动时,就会创建 ServletContext),即生命周期监听,应用场景
(1)加载初始化的配置文件;比如 spring 的配置文件
(2)任务调度(配合定时器 Timer/TimerTask)
-
相关方法
void contextInitialized(ServletContextEvent sce)
创 建
Servletcontext
时 触 发
void contextDestroyed(ServletContextEvent sce) 销毁 Servletcontext 时
2.2 ServletContextAttributeListener 监听器
-
作用:监听 ServletContext 属性变化
-
相关方法
void attributeAdded(ServletContextAttributeEvent event) 添加属性时调用 void attributeReplaced(ServletContextAttributeEvent event) 替换属性时调用 void attributeRemoved(ServletContextAttributeEvent event) 移除属性时调用
三、其他监听器(使用较少)
3.1 HttpSessionListener 监听器
-
作用:监听 Session 创建或销毁,即生命周期监听
-
相关方法
void sessionCreated(HttpSessionEventse) 创建session时调用 void sessionDestroyed(HttpSessionEvent se) 销毁 session 时调用
可以用于监控用户上线,离线
3.2HttpSessionAttributeListener 监听器
-
作用:监听 Session 属性的变化
-
相关方法
void attributeAdded(ServletRequestAttributeEvent srae) 添加属性时 void attributeReplaced(ServletRequestAttributeEvent srae) 替换属性时 void attributeRemoved(ServletRequestAttributeEvent srae) 移除属性时
3.3 ServletRequestListener 监听器
-
作用:监听 Request 创建或销毁,即 Request 生命周期监听
-
相关方法
void requestInitialized(ServletRequestEvent sre) 创建 request 时 void requestDestroyed(ServletRequestEvent sre) 销毁 request 时
可以用来监控, 某个 IP 访问我们网站的频率, 日志记录 ,访问资源的情况.
3.4 ServletRequestAttributeListener 监听器
-
作用:监听 Request 属性变化
-
相关方法
void attributeAdded(ServletRequestAttributeEvent srae) 添加属性时 void attributeReplaced(ServletRequestAttributeEvent srae) 替换属性时 void attributeRemoved(ServletRequestAttributeEvent srae)移除属性时
3.4 HttpSessionBindingListener 感知监听器
3.5 HttpSessionActivationListener 感知监听器
JavaWeb 三大组件之过滤器 Filter
一、过滤器介绍
-
Filter 过滤器它是 JavaWeb 的三大组件之一(Servlet 程序、Listener 监听器、Filter 过滤器)
-
Filter 过滤器是 JavaEE 的规范,是接口
-
Filter 过滤器它的作用是:拦截请求,过滤响应
-
应用场景
- 权限检查
- 日记操作
- 事务管理
二、Filter 过滤器基本原理
三、Filter 过滤器 url-pattern
-
url-pattern : Filter 的拦截路径, 即浏览器在请求什么位置的资源时,过滤器会进行拦截过滤
-
精确匹配 <url-pattern>/a.jsp</url-pattern> 对应的 请求地址http://ip[域名]:port/工程路径/a.jsp 会拦截
-
目录匹配 <url-pattern>/manage/*</url-pattern>对应的 请求地址http://ip[域名]:port/工程路径/manage/xx , 即 web 工程 manage 目录下所有资源 会拦截
-
后缀名匹配 <url-pattern>*.jsp</url-pattern> 后缀名可变,比如 *.action *.do 等等对应的 请求地址http://ip[域名]:port/工程路径/xx.jsp , 后缀名为 .jsp 请求会拦截
-
Filter 过滤器它只关心请求的地址是否匹配,不关心请求的资源是否存在
四、Filter 过滤器生命周期
- Filter 生命周期图解
五、FilterConfig
-
FilterConfig 接口图
-
FilterConfig 说明
- FilterConfig 是 Filter 过滤器的配置类
- Tomcat 每次创建 Filter 的时候,也会创建一个 FilterConfig 对象,这里包含了 Filter 配置文件的配置信息。
- FilterConfig 对象作用是获取 filter 过滤器的配置内容
六、 FilterChain 过滤器链
-
FilterChain: 在处理某些复杂业务时,一个过滤器不够,可以设计多个过滤器共同完成过滤任务,形成过滤器链。
-
基本原理示意图
-
FilterChain 注意事项和细节
- 多个 filter 和目标资源在一次 http 请求,在同一个线程中
- 当一个请求 url 和 filter 的 url-pattern 匹配时, 才会被执行, 如果有多个匹配上,就会顺序执行,形成一个 filter 调用链(底层可以使用一个数据结构搞定)
- 多个 filter 共同执行时,因为是一次 http 请求, 使用同一个 request 对象
- 多个 filter 执行顺序,和 web.xml 配置顺序保持一致
- chain.doFilter(req, resp)方法 将执行下一个过滤器的 doFilter 方法, 如果后面没有过滤器,则执行目标资源。
- 注意执行过滤器链时, 顺序是(用前面的案例分析) Http 请求 -> A 过滤器 dofilter()-> A 过滤器前置代码 -> A 过滤器chain.doFilter() -> B 过滤器 dofilter() ->B 过滤器前置代码-> B 过滤器 chain.doFilter() -> 目标文件 -> B过滤器后置代码 -> A过滤器后置代码 ->返回给浏览器页面/数据