过滤器与监听器

1、什么是过滤器?
过滤器是在执行某个url前所需要做的事情,url可能是某个serlvet所对应的,也有可能是jsp页面

特点:
声明式的
动态的
灵活的
模块化的
可移植的
可重用的
透明的

用处:
统一的认证处理
对用户的请求做检查、做更精确的纪录
监视或对用户所传递的参数做前置处理,如防止数据隐藏码攻击
改变图像文件的格式
对响应做编码的动作
对响应做压缩处理
对XML的输出使用xslt来转换


2、过滤器的写法
1)自定义类,实现javax.servlet.Filter接口
2)分别实现init(FilterConfig), doFilter(ServletRequest, ServletResponse, FilterChain)
destroy()
3)在web.xml中配置该filter
告诉web容器存在这么一个filter,可以使用<init-param>配置filter的初始化参数,在Filter代码中用FilterConfig对象获取初始化参数

<filter>
<filter-name></filter-name>
<filter-class></filter-class>
</filter>

告诉web容器此filter对哪个url进行过滤

<filter-mapping>
<filter-name></filter-name>
<servlet-name></servlet-name> 准确地告诉filter该过滤哪个servlet
<url-pattern></url-pattern> 可以使用通配符过滤多个servlet
</filter-mapping>

3、Filter的生命周期
*1)init(FilterConfig)初始化方法
在tomcat容器启动的时候就会对过滤器进行初始化
2)在执行其过滤的url时,先初始化该url所对应的serlvet
*3)调用filter的doFilter()方法,进行过滤,使用chain.doFilter传递给下一个过滤器或servlet
4)执行下一个过滤器的doFilter方法,或者servlet的service方法
*5)在关闭web容器时,调用 destroy()销毁过滤器

4、什么是FilterChain?
FilterChain对象是过滤器链,可以由一个Filter传递到另外的一个Filter,或者直接传递到被过滤的servlet
如果下一个是过滤器,则传递给过滤器,执行下一个过滤器的doFilter;
如果下一个是servlet,则传递给servlet。执行此servlet的service方法

使用FilterChain对象的doFilter()方法进行过滤器链的传递

doFilter(ServletRequest, ServletResponse), 会把在这里修改的request和response传递给下一个过滤器或者Servlet

在chain.doFilter前执行的方法叫前置方法
在chain.doFilter后执行的方法叫后置方法
filter1执行前置方法,filter1的doFilter到filter2, filter2执行前置方法,filter2的doFilter到servlet,
servlet执行service方法,
返回到filter2执行后置方法,
返回到filter1执行后置方法

5、过滤器中的执行顺序
根据web.xml中配置的filter的顺序来执行,如果两个或多个filter最终都是过滤同一个servlet,则按照顺序从上往下执行每个filter

6、ServletContextListener web上下文监听器
对部署在tomcat等web容器的应用的初始化和销毁进行监听

写自己的监听器实现javax.servlet.ServletContextListener接口

1 contextInitialized(ServletContextEvent sce) // 当web应用初始化时调用 的方法
2 contextDestroyed(ServletContextEvent sce) // 当tomcat等web容器关闭时调用的方法

使用情景:访问人数的初始化,web应用的全局配置

7、javax.servlet.ServletContextAttributeListener 对application(ServletContext) 对象中属性的添加,移除,更新的监听

attributeAdded(ServletContextAttributeEvent scae)  //添加属性时调用的方法
attributeRemoved(ServletContextAttributeEvent scae)  //移除属性时调用的方法
attributeReplaced(ServletContextAttributeEvent scae) // 更新属性时调用的方法

scae.getName()可以获取到属性的名称
scae.getValue()获取到属性的值

8、javax.servlet.http.HttpSessionListener接口 对session创建与销毁的监听
tomcat容器关闭时产不调用sessionDestroyed(HttpSessionEvent se); 是在session.invalidat()或者timeout
第一次访问的时候就会创建Session,则会调用sessionCreated(HttpSessionEvent se)。并不是说在request.getSession()时调用

9、javax.servlet.http.HttpSessionAttributeListener 对session中属性的监听

1 attributeAdded(HttpSessionBindingEvent se)  //添加属性时调用的方法
2 attributeRemoved(HttpSessionBindingEvent se)  //移除属性时调用的方法
3 attributeReplaced(HttpSessionBindingEvent se)  //更新属性时调用的方法

10、javax.servlet.http.HttpSessionActivationListener
Activate与Passivate是用于置换对象的动作,当Session对象由于资源利用或负载平衡等原因而必须
暂时储存至硬盘或其它储存器上时(透过对象序列化),所作的动作称之为Passivate,
而硬盘或储存器上的Session对象重新加载JVM时所作的动作称之为Activate

11、javax.servlet.http.HttpSessionBingingListener
实现了该接口的其他类的对象被添加到session的属性中时或从Session中移除,而调用的

1 valueBound(HttpSessionBindingEvent event); 该类的对象被添加到session时调用
2 valueUnbound(HttpSessionBindingEvent event); 该类的对象从session中移除时调用 

12、javax.servlet.ServletRequestListener
监听request请求的初始化和销毁

requestDestroyed(ServletRequestEvent sre)  //请求销毁时调用
requestInitialized(ServletRequestEvent src)  //请求初始化时调用

13、javax.servlet.ServletRequestAttributeListener
当设置属性到request中,或从Request中移除,更新属性所调用的

1 attributeAdded(ServletRequestAttributeEvent srae) 添加属性时调用的方法
2 attributeRemoved(ServletRequestAttributeEvent srae) 移除属性时调用的方法
3 attributeReplaced(ServletRequestAttributeEvent srae) 更新属性时调用的方法

14、事件对象

javax.servlet.ServletContextEvent getServletContext();
javax.servlet.http.HttpSessionEvent getSission();
javax.servlet.ServletRequestEvent getServletRequest();

15、java.util.Propertis类的使用
用于读取.properties文件,根据properties文件中指定的key值获取到对应的value值
参考WEB-INF目录下test.properties, ConfigUtil.java, PathUtil.java


原文地址:https://www.cnblogs.com/A0926/p/5443836.html