Java Web中过滤器和监听器重点总结

过滤器:

  1. 是向Web应用程序的请求和响应添加功能的Web服务组件
  2. 过滤器可以统一的集中处理请求和响应
  3. 使用过滤器技术实现对请求数据的过滤
  4. 过滤器用于拦截传入的请求和传出的响应
  5. 监视、修改或以某种方式处理正在客户端和服务器之间交换的数据流
  6. 使用过滤器封装公共任务具有如下优点:模块化;声明式;可重用;透明性

过滤器的常见用途:

利用过滤器特殊的执行时机,可以实现 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早。

过滤器生命周期:

  1. 实例化
  2. 初始化
  3. 过滤doFiIter( )
  4. 销毁destroy( )
  5. 实际应用举例:编码处理、解决用户登录问题

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;

        }   }   ……   }

过滤器链简介:

  1. 当请求的URL与多个过滤器的映射范围相吻合时,这些过滤器会依次对请求进行过滤,形成过滤器链
  2. 过滤器链的运行建立在嵌套调用的基础上
  3. 可以根据业务需要,通过映射配置将过滤器链接组合起来,以提供更加全面的辅助功能

过滤器链的应用:

过滤器链中各过滤器之间是嵌套调用关系。

调用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. 监听三个域对象的创建和销毁事件的监听器

  1. javax.servlet.ServletContextListener:监听ServletContext对象的初始化与销毁事件
  2. javax.servlet.http.HttpSessionListener:监听HttpSession对象的创建与销毁事件
  3. javax.servlet.ServletRequestListener:监听ServletRequest对象的初始化与销毁事件,分别对应请求到达Web应用和离开Web应用

2. 监听域对象中属性的增加、删除、替换事件的监听器

  1. javax.servlet.ServletContextAttributeListener:监听application作用域中变量的增加、移除、替换事件
  2. javax.servlet.http.HttpSessionAttributeListener:监听session作用域中变量的增加、移除、替换事件
  3. javax.servlet.ServletRequestAttributeListener:监听request作用域中变量的增加、移除、替换事件

3. 监听绑定到HttpSession域中的某个对象的状态的监听器,又称为感知型监听器

  1. javax.servlet.http.HttpSessionBindingListener:其实现类的实例可以感知自己被绑定到session中或从session中解绑的事件
  2. javax.servlet.http.HttpSessionActivationListener:其实现类的实例绑定到session中后,容器在钝化和活化session时将通知该实例
  3. HttpSessionListener和HttpSessionAttributeListener可以对session作用域中的JavaBean实现统一的事件处理,感知型监听器则可以实现只对特定类型的JavaBean进行针对性的事件处理

ServletContextListener:

1. 监听ServletContext对象的初始化与销毁事件

2. 常用于资源初始化加载、初始化创建等工作

3. 包含如下方法签名

  1. void contextInitialized( ServletContextEvent sce ):对应ServletContext对象的初始化事件
  2. void contextDestroyed( ServletContextEvent sce):对应ServletContext对象的销毁事件

4. 参数javax.servlet.ServletContextEvent是代表Web应用上下文变化的事件类型,包含一个方法

public ServletContext getServletContext( ):获得正在创建或销毁的ServletContent实例

HttpSessionAttributeListener:

1. 监听session作用域中变量的增加、移除、替换事件

2. 包含如下方法签名

  1. void attributeAdded(HttpSessionBindingEvent event ):对应变量被添加到session作用域的事件
  2. void attributeRemoved(HttpSessionBindingEvent event ):对应session作用域中的变量被移除的事件
  3. void attributeReplaced(HttpSessionBindingEvent event ):对应session作用域中的变量被替换的事件

3. 参数javax.servlet.http.HttpSessionBindingEvent是代表session作用域中属性变化的事件类型,包含如下方法

  1. public HttpSession getSession():返回当前变化所对应的HttpSession对象
  2. public String getName():返回发生变化的变量的名称
  3. public Object getValue():对应不同的操作,可分别返回新添加的变量值、被移除的变量值、被替换的变量的旧值

4. HttpSessionActivationListener类型的监听器同样无须在web.xml文件中声明,将其实例放入session作用域即可

HttpSessionBindingListener:

1. 其实例可感知自己与session作用域绑定和解绑的事件

2. 包含如下方法签名

  1. void valueBound(HttpSessionBindingEvent event ):对应监听器实例绑定到session作用域的事件
  2. void valueUnbound(HttpSessionBindingEvent event ):对应监听器实例从session作用域解绑的事件

3. 当一个实现了该接口的对象,被捆绑到session中或从session中被解放的时候启用此监听

关键点:

  1. 创建类实现HttpSessionBindingListener接口
  2. valueBound ( )
  3. valueUnbound( )
  4. 不需要在web.xmI中配置监听器
  5. 监听范围:一对一

HttpSessionListener:

在WEB应用中,当一个session被创建或者销毁时启用这个监听器;session是一次会话

关键点:

  1. sessionCreated(HttpSessionEvent  event):客户端第一次和服务器交互时候触发
  2. sessionDestroyed(HttpSessionEventevent):销毁会话的时候触发
  3. 必须在web.xmI中配置监听器
  4. 监听范围:设置一次就可以监听所有session

HttpSessionBindingListener监听器和HttpSessionListener监听器的区别:

  1. HttpSessionBindingListener不需要再web.xml里配置,是一对一的监听。
  2. HttpSessionListener必须在web.xmI中配置,可以监听所有session。

session钝化与活化:

1. session钝化的本质就是把内存中的session对象序列化到存储设备中

2. 活化就是通过反序列化将session对象从存储设备上进行恢复

3. 可能用到钝化与活化的情况

  1. 服务器资源不足
  2. 重启服务器
  3. Web应用被重新加载

4. session作用域中的变量只有实现了java.io. Serializable接口才能被钝化存储,否则将在钝化时被丢弃

5. 实现了HttpSessionActivationListener接口的JavaBean实例被添加到session后,能够感知session的钝化与活化事件,可以针对自身需要进行必要处理

总结:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值