今日内容
- 过滤器
- 监听器
一、过滤器Filter
(一)概述
1.概念
过滤器是一个服务器端的组件,它可以截取客户端的请求和服务端的响应信息,并对这些信息进行过滤处理。
2.原理:先过滤,后放行。
3.应用场景
(1)统一处理中文编码问题
(2)统一处理登录控制功能
(二)如何创建过滤器
方式一:使用web.xml注册过滤器
- 创建一个普通类实现Filter接口
- 重写Filter接口中的三个方法
- 在web.xml文件中注册过滤器
测试:
方式二:使用注解方式注册过滤器
- 创建一个普通类继承Filter接口
- 重写Filter接口中的三个方法
- 使用注解注册过滤器
这里我们可以直接通过@WebFilter("/*")注解的方式进行过滤器的注册,省去了web.xml繁琐的配置。
说明:过滤器常用的路径配置格式有以下三种
1./*过滤所有的服务器端资源
2.*.do表示过滤所有以.do结尾的服务器端资源
3./hello 只能过滤hello这个路径的服务器端资源
过滤器的生命周期
1.调用init()方法初始化实例,在服务器启动时只调用一次;
2.每次访问请求,如果被访问的请求符合过滤条件都会调用doFilter()方法进行真正的过滤处理;
3.停止服务器调用destroy()方法,销毁实例,释放资源,只执行一次。
(三)过滤器的特点:
1.一个过滤器可以过滤多个servlet或者请求路径
2.过滤器默认情况下只过滤重定向的路径,不过滤转发路径。
设置过滤转发路径:
web.xml
注解
- 使用过滤器实现统一编码
- 使用过滤器实现登录控制
二、监听器Listener
(一)概述
1.概念
监听器就是一个实现了特定接口的Java类,主要用于监听某个域对象(三个)的状态变化的组件。
2.分类
第一维度:按照被监听的对象划分:ServletRequest域 、HttpSession域 、 ServletContext域
第二维度:监听的内容分:域对象的创建与销毁的、域对象的属性变化的、绑定到HttpSession域中某个对象状态的
3.原理
监听器涉及到以下几个组成部分:
(1)事件源:被监听的对象,即:request、session、servletContext三大域对象。
(2)监听器:监听事件源对象,事件源对象状态的变化都会触发监听器。
(3)注册监听器:将监听器与事件源进行绑定,有两种注册方式:web.xml 或 @WebListener注解
(4)事件:域对象发生改变时,立即触发监听器方法的执行。
原理图:
4.应用场景
(1)统计网站在线人数
(2)实现任务调度,启动定时程序
5.如何创建
步骤:
(1)定义一个普通类实现监听器接口;
(2)重写监听器接口方法;
(3)注册监听器:配置 web.xml 或 @WebListener注解
(二)监听域对象的创建与销毁
1. ServletContextListener
ServletContextListener监听器:用来监听ServletContext域对象的创建和销毁。
ServletContext对象代表全局唯一对象,每个web工程会产生一个ServletContext对象,服务器启动时创建,服务器关闭时销毁。
2. HttpSessionListener
HttpSessionListener监听器:用来监听HttpSession域对象的创建和销毁。
Session何时创建:Servlet中是request.getSession() ,JSP页面中自带Session,在浏览器第一次访问web项目时。
Session何时销毁:非正常关闭服务器,Session过期,session.invalidate()
3. ServletRequestListener
ServletRequestListener监听器:用来监听ServletRequest域对象的创建和销毁。
Request何时创建:请求发起时创建
Request何时销毁:响应结束时销毁
(三)监听域对象属性改变
ServletContext、HttpSession、ServletRequest中添加数据、修改数据、移除数据的监听器。
添加数据:setAttribute(key,value); 第一次向域中存值时
修改数据:setAttribute(key,value); 第二次以后key不变的情况下,只改值
移除数据:removeAttribute(key);
1. ServletContextAttributeListener
ServletContextAttributeListener监听器:监听ServletContext中属性的变化。
2. HttpSessionAttributeListener
HttpSessionAttributeListener监听器: 监听HttpSession中属性的变化。
案例:
创建监听器:
@WebListener |
测试监听器:
3. ServletRequestAttributeListener
ServletRequestAttributeListener 监听器:监听ServletRequest中属性的变化。
以下是此类监听器对域中属性进行不同操作时所触发的方法:
(1)attributeAdded监听属性添加 — 当数据范围对象没有该属性,第一次添加时会自动触发调用执行
(2)attributeRemoved 监听属性移除 — 从一个数据范围对象删除一个已经存在的属性时会自动触发执行。
(3)attributeReplaced监听属性替换 — 当一个数据范围已经存在一个属性,向数据范围添加相同名称属性时自动触发替换方法。
(四)监听绑定到HttpSession域中某个对象状态
此类监听器是Servlet中比较特殊的监听器,主要用来监听绑定到Session域中特定对象的状态。
- 绑定:将Java对象绑定到session中。
- 解除绑定:将Java对象从session中解除绑定。
HttpSessionBindingListener
- 钝化 :数据随 Session 对象序列化到一个存储设备中(硬盘)。
- 活化 :数据随 Session 对象从一个存储设备中(硬盘)恢复到内存。
HttpSessionActivationListener
1. HttpSessionBindingListener
实现HttpSessionBindingListener接口的Java对象,可以感知自身被绑定到Session或者从Session中解除绑定。
2. HttpSessionActivationListener
实现HttpSessionActivationListener接口的Java对象,可以感知从内存被钝化到硬盘,从硬盘活化到内存中。
钝化时机:服务器关闭或重启,指定时间内(长时间)不操作服务器。
活化时机:服务器再次开启。
课堂案例:监听一个老师对象的钝化与活化状态
- 创建一个老师类Teacher实现HttpSessionActivationListener接口,并重写内部两个方法。
package com.ujiuye.listener; |
- 配置tomcat根目录下conf文件夹里的context.xml文件,其中directory="e:\test"表示自定义钝化文件的存储路径,maxIdleSwap="1"表示超过1分钟未操作服务器会自动钝化。
<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="5"> <Store className="org.apache.catalina.session.FileStore" directory="D:\session"> </Store> </Manager> |
- 测试:创建一个first.jsp页面,向session中保存一个老师对象。
|
再创建一个second.jsp页面获取活化后session中的数据是否存在
|
测试:先访问first.jsp存数据,通过过期时间或手动关闭服务器让session对象发生钝化操作。
再重新启动服务器,直接访问second.jsp页面获取活化数据。
3. 特别注意:
(1)实现这两个接口的类不需要在 web.xml 文件或注解中进行注册监听器,都是由Session自主完成的。
(2)HttpSessionActivationListener监听器涉及到Java对象的序列化操作,因此必须同时实现Serializable接口。
(五)综合案例:统计网站在线人数
思路分析:通过ServletContextListener监听,当Web应用上下文启动时,在ServletContext中添加一个List集合,用来准备存放在线的用户名;然后,可以通过HttpSessionAttributeListener监听器,当用户登录成功,把用户名设置到Session中时,同时将用户名存放到ServletContext中的List列表中;最后通过HttpSessionListener监听,当用户注销会话时,将用户名从应用上下文范围中的List列表中删除。
实现步骤:
- 创建监听器
- 创建登录页
- 登录Servlet
- 退出Servlet
- 显示在线人数