过滤器和监听器

过滤器(Filter(接口)):过滤器就是servlet的一个特例
什么是过滤器:是servlet2.3规范中定义的一种小型的,可插入的
web组件,用来拦截servlet容器的请求和响应过程
以便查看,提取或以某种方式操作正在客户端和服务器
之间交换的数据,
过滤器通常是封装了一些web功能的组件,这些功能很重要
但对于处理客户端后发送响应来说不是决定性的
实现过滤器的步骤:
1.创建一个java类,实现javax.servlet.Filter;接口
2.在实现类中doFilter方法添加过滤或拦截的算法
3.在web.xml中添加<filter></filter><filter-mapping></filter-mapping>

过滤器初始化参数:
容器启动之后,会创建过滤器对象,然后会调用init方法,在init方法中
读取web.xml中的初始化参数(包括局部和全局),在执行doFilter方法前
做数据初始化工作。

过滤器的优点:
实现代码的“可插拔性”,即增加或减少某个功能模块,不会影响程序的
正常运行,可以将多个相同处理逻辑的模块集中写在过滤器里,方便维护

只要:在需求说明中有这样的词语,“过滤”,“拦截”,“代理”,
“在原有功能基础上添加新功能”,“在主业务之前,之后添加功能”
那么,第一反应用代理模式实现,或(servlet filter)


过滤器的生命周期:当服务启动时,会加载web.xml中的内容
如果文件中有<filter>项,那么读取<filter-class>节点
中的内容,然后反射实例化对象,过滤器的的声明周期开始
如果过滤器类不存在就无法反射,那么就在服务器启动时报异常
生命周期开始后会自动调用init方法(只调用一次)
如果<url-patten>节点中放置的是/*,代表所有请求都要被此
过滤器拦截,只要请求任何资源都会进入此过滤器的doFilter
这个方法,在此方法中做相关检测工作,如果检测成功了,就
可以通过filterChain.doFilter(servletRequest,servletResponse);
去寻找下一个过滤器,如果下一个过滤器不存在就直接访问对应的资源
如果存在,就进入下一个过滤器的doFilter方法,执行完后,依次退回

当服务器正常停止的时候,会调用destroy方法,过滤器声明周期结束

如果有多个过滤器就是过滤器链,执行顺序跟web.xml的加载(生命周期)顺序一样

监听器:servlet规范中定义的一种特殊的组件,用来监听servlet容器产生
的事件,并做响应的处理
容器产生的事件有两大类:
生命周期相关的事件
ServletRequestListener request对象的监听器
HttpSessionListener session对象的监听器
sessionCreate方法, 当服务器创建session对象时就调用此方法
sessionDestroyed方法,当session对象销毁时调用此方法
ServletContextListener application对象的监听器
绑定数据相关的事件
当调用了request对象,session对象,
servletContext(application)对象的setAttribute方法
和removeAttribute方法时产生的事件
ServletRequestAttributeListener
attributeAdded方法,当给调用request.setAttribute()方法时触发此方法
attributeRemoved方法,当requset中的对象被移除的时候调用此方法
attributeReplaced方法,当request中的对象被替换的时候调用此方法
HttpSessionAttributeListener
attributeAdded方法
attributeRemoved方法
attributeReplaced方法
ServletContextAttributeListener
attributeAdded方法
attributeRemoved方法
attributeReplaced方法

实现监听器的步骤:
1.新建一个java类要实现上面对应监听器接口
2.编写对应方法的监听逻辑
3.在web.xml中,注册监听器<listener></listener>

原文地址:https://www.cnblogs.com/songyao2018/p/8804856.html