Java Web中过滤器和监听器重点总结
过滤器:
- 是向Web应用程序的请求和响应添加功能的Web服务组件
- 过滤器可以统一的集中处理请求和响应
- 使用过滤器技术实现对请求数据的过滤
- 过滤器用于拦截传入的请求和传出的响应
- 监视、修改或以某种方式处理正在客户端和服务器之间交换的数据流
- 使用过滤器封装公共任务具有如下优点:模块化;声明式;可重用;透明性
过滤器的常见用途:
利用过滤器特殊的执行时机,可以实现 Web 应用程序中的预处理和后期处理逻辑
日志记录;改善性能;安全与会话管理;敏感字过滤
Filter:
过滤器使用步骤:
1. 建立实现Filter接口的类(javax. servlet. Filter)
2. 实现过滤行为-doFilter ( )
doFilter(…) {
//过滤请求
; //调用下一个过滤器或Web资源
//过滤响应
3. 在web. xmI中配置过滤器
<filter>
<filter-name>过滤器名</filter-name>
<filter-class>过滤器的完全限定名</filter-class>
</filter>
<filter-mapping>
<filter-name>过滤器名<filter-name>
<url-pattern>过滤器映射的Web资源</url-pattern>
url-pattern指的是我过滤谁
完全匹配:/index.jsp
目录匹配:/admin/*
扩展名匹配:*.do
全部匹配:/*
</filter-mapping>
Filter的启动会比Servlet早。
过滤器生命周期:
- 实例化
- 初始化
- 过滤doFiIter( )
- 销毁destroy( )
- 实际应用举例:编码处理、解决用户登录问题
Filter接口:
javax.servlet.Filter接口定义了过滤器需要实现的方法
方法名称 |
功能描述 |
void init( FilterConfig filterConfig) |
Web容器调用该方法实现过滤器的初始化 |
void doFilter( ServletRequest request, ServletResponse response, FilterChain chain ) |
当客户端请求资源时,Web容器会调用与资源对应的过滤器的doFilter( )方法。在该方法中,可以对请求和响应进行处理,实现过滤器的功能 |
void destroy( ) |
Web容器销毁过滤器时调用该方法,可用来释放过滤器所用的资源 |
FilterConfig接口:
在过滤器初始化过程中获取配置信息
方法名称 |
功能描述 |
String getFilterName() |
返回部署描述符中定义的过滤器的名称 |
Enumeration<String> getInitParameterNames() |
返回 <filter> 元素中定义的 init 参数的名称的字符串枚举 |
String getInitParameter (String name) |
获取web.xml中设置的以name命名的初始化参数值 |
ServletContext getServletContext() |
返回过滤器所属的Web上下文对象引用 |
读取初始化参数:
<web-app>
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>
javaeedemo.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>charset</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
……
</web-app>
获取初始化参数:
public class CharacterEncodingFilter implements Filter {
private String charset = null;
……
public void init(FilterConfig arg0) throws ServletException {
String initParam = arg0.getInitParameter("charset");
//读取指定名称的参数
if ( initParam != null
&& (initParam = initParam.trim()).length() != 0 ) {
log.info("将CharacterEncodingFilter的charset设置为"
+ initParam);
charset = initParam;
} } …… }
过滤器链简介:
- 当请求的URL与多个过滤器的映射范围相吻合时,这些过滤器会依次对请求进行过滤,形成过滤器链
- 过滤器链的运行建立在嵌套调用的基础上
- 可以根据业务需要,通过映射配置将过滤器链接组合起来,以提供更加全面的辅助功能
过滤器链的应用:
过滤器链中各过滤器之间是嵌套调用关系。
调用FilterChain对象的doFilter( )方法会导致链中的下一个过滤器被调用。如果正在执行的是链中最后一个过滤器,则目标资源将被调用。
调整过滤器链的执行顺序:
过滤器链式排列的顺序由web.xml描述信息中<filter-mapping>元素的顺序决定
实际开发中,可以综合业务逻辑需要和性能等因素,通过调整<filter-mapping>元素的顺序,合理安排过滤器链中各过滤器的执行次序
监听器:
Listener:
1. Listener是Servlet的监听器
2. 监听客户端的请求和服务器端的操作
3. 通过实现Listener接口的类可以在特定事件(Event)发生时,自动激发一些操作
4. 监听器是Web应用程序事件模型的一部分
5. Web应用中的某些状态发生改变时会产生相应的事件
ServletContext、HttpSession、ServletRequest三个域对象引发的事件
域对象中的属性引发的事件
6. 监听器可以接收这些事件,以便在事件发生时做出相关处理
常用监听器接口:
监听器接口 |
说明 |
javax.servlet.ServletContextListener |
在Servlet上下文对象初始化或销毁时得到通知 |
javax.servlet.ServletContextAttributeListener |
在Servlet上下文中的属性列表发生变化时得到通知 |
javax.servlet.http.HttpSessionListener |
在session创建后或者失效前得到通知 |
javax.servlet.http.HttpSessionActivationListener |
绑定到session中,当session被钝化或者**时得到通知 |
javax.servlet.http.HttpSessionAttributeListener |
在session中的属性列表发生变化时得到通知 |
javax.servlet.http.HttpSessionBindingListener |
在绑定session或从session中删除时会得到通知 |
javax.servlet.ServletRequestListener |
在请求对象初始化时或者被销毁时得到通知 |
javax.servlet.ServletRequestAttributeListener |
在请求对象中的属性列表发生变化时得到通知 |
监听器分类:
根据三个域对象上的具体操作,将监听器划分为三类:
1. 监听三个域对象的创建和销毁事件的监听器
- javax.servlet.ServletContextListener:监听ServletContext对象的初始化与销毁事件
- javax.servlet.http.HttpSessionListener:监听HttpSession对象的创建与销毁事件
- javax.servlet.ServletRequestListener:监听ServletRequest对象的初始化与销毁事件,分别对应请求到达Web应用和离开Web应用
2. 监听域对象中属性的增加、删除、替换事件的监听器
- javax.servlet.ServletContextAttributeListener:监听application作用域中变量的增加、移除、替换事件
- javax.servlet.http.HttpSessionAttributeListener:监听session作用域中变量的增加、移除、替换事件
- javax.servlet.ServletRequestAttributeListener:监听request作用域中变量的增加、移除、替换事件
3. 监听绑定到HttpSession域中的某个对象的状态的监听器,又称为感知型监听器
- javax.servlet.http.HttpSessionBindingListener:其实现类的实例可以感知自己被绑定到session中或从session中解绑的事件
- javax.servlet.http.HttpSessionActivationListener:其实现类的实例绑定到session中后,容器在钝化和活化session时将通知该实例
- HttpSessionListener和HttpSessionAttributeListener可以对session作用域中的JavaBean实现统一的事件处理,感知型监听器则可以实现只对特定类型的JavaBean进行针对性的事件处理
ServletContextListener:
1. 监听ServletContext对象的初始化与销毁事件
2. 常用于资源初始化加载、初始化创建等工作
3. 包含如下方法签名
- void contextInitialized( ServletContextEvent sce ):对应ServletContext对象的初始化事件
- void contextDestroyed( ServletContextEvent sce):对应ServletContext对象的销毁事件
4. 参数javax.servlet.ServletContextEvent是代表Web应用上下文变化的事件类型,包含一个方法
public ServletContext getServletContext( ):获得正在创建或销毁的ServletContent实例
HttpSessionAttributeListener:
1. 监听session作用域中变量的增加、移除、替换事件
2. 包含如下方法签名
- void attributeAdded(HttpSessionBindingEvent event ):对应变量被添加到session作用域的事件
- void attributeRemoved(HttpSessionBindingEvent event ):对应session作用域中的变量被移除的事件
- void attributeReplaced(HttpSessionBindingEvent event ):对应session作用域中的变量被替换的事件
3. 参数javax.servlet.http.HttpSessionBindingEvent是代表session作用域中属性变化的事件类型,包含如下方法
- public HttpSession getSession():返回当前变化所对应的HttpSession对象
- public String getName():返回发生变化的变量的名称
- public Object getValue():对应不同的操作,可分别返回新添加的变量值、被移除的变量值、被替换的变量的旧值
4. HttpSessionActivationListener类型的监听器同样无须在web.xml文件中声明,将其实例放入session作用域即可
HttpSessionBindingListener:
1. 其实例可感知自己与session作用域绑定和解绑的事件
2. 包含如下方法签名
- void valueBound(HttpSessionBindingEvent event ):对应监听器实例绑定到session作用域的事件
- void valueUnbound(HttpSessionBindingEvent event ):对应监听器实例从session作用域解绑的事件
3. 当一个实现了该接口的对象,被捆绑到session中或从session中被解放的时候启用此监听
关键点:
- 创建类实现HttpSessionBindingListener接口
- valueBound ( )
- valueUnbound( )
- 不需要在web.xmI中配置监听器
- 监听范围:一对一
HttpSessionListener:
在WEB应用中,当一个session被创建或者销毁时启用这个监听器;session是一次会话
关键点:
- sessionCreated(HttpSessionEvent event):客户端第一次和服务器交互时候触发
- sessionDestroyed(HttpSessionEventevent):销毁会话的时候触发
- 必须在web.xmI中配置监听器
- 监听范围:设置一次就可以监听所有session
HttpSessionBindingListener监听器和HttpSessionListener监听器的区别:
- HttpSessionBindingListener不需要再web.xml里配置,是一对一的监听。
- HttpSessionListener必须在web.xmI中配置,可以监听所有session。
session钝化与活化:
1. session钝化的本质就是把内存中的session对象序列化到存储设备中
2. 活化就是通过反序列化将session对象从存储设备上进行恢复
3. 可能用到钝化与活化的情况
- 服务器资源不足
- 重启服务器
- Web应用被重新加载
4. session作用域中的变量只有实现了java.io. Serializable接口才能被钝化存储,否则将在钝化时被丢弃
5. 实现了HttpSessionActivationListener接口的JavaBean实例被添加到session后,能够感知session的钝化与活化事件,可以针对自身需要进行必要处理