41 Filter和Listener核心技术

200 阅读4分钟

1 Filter过滤器

Filter过滤器是JavaWeb三大组件之一,三大组件分别为:Servlet、Filter以及Listener,过滤器是向web应用程序的请求和响应处理添加功能的Web服务组件。

过滤器可以简单理解为在浏览器和web资源之间的一道过滤网,在访问资源之前可以通过一系列的过滤器对请求进行修改、判断以及拦截等,也可以对响应进行修改、判断以及拦截。

Filter.PNG

使用Filter过滤器方式:

  • 自定义类实现Filter接口并重写doFilter方法

    public class LoginFilter implents Filter{
      public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain){
        chain.doFilter(request,response);
        
      }
    }
    
  • 在web.xml文件中配置过滤器

    <filter>
      <filter-name>LoginFilter</filter-name>
      <filter-class>com.bjx.LoginFilter</filter-class>
      <filter-mapping>
        <filter-name>LoginFilter</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>
    </filter>
    

2 Filter接口

Filter接口主要用于描述过滤器对象,可以对资源的请求和资源的响应操作进行筛选操作。常用方法如下:

方法声明功能介绍
void init(FilterConfig config)实现过滤器的初始化
void doFilter(ServletRequest request,ServletResponse response,FilterChainn chain)执行过滤操作
void destroy()视线对过滤器的销毁

FilterConfig接口主要用于描述过滤器的配置相关信息,常用方法如下:

方法声明功能介绍
String getFilterName()获取过滤器的名字
String getInitParmeter(String name)获取指定的初始化参数信息
Enumeration getInitParameterNames()获取所有的初始化操作名称
ServletContext getServletContext()获取ServletContext对象

当项目中配置多个过滤器时,是怎样执行的,具体顺序如下:

Filters.PNG

过滤器优点:

  • 实现代码的可插拔性,既增加或减少某功能模块,不会影响程序的正常执行
  • 可以将多个相同处理逻辑的模块集中写在过滤器里面,实现代码重复利用,方便代码的维护。

3 Listener监听器

Listener监听器用来监听Servlet容器产生的事件并进行相应的处理。

容器产生的事件分类如下:

  • 生命周期相关事件
  • 属性状态相关事件
  • 存值状态相关事件

监听器的底层原理是采用接口回调的方式实现

监听器基本分类:

方法声明功能介绍
ServletRequestListener监听request作用域的创建和销毁
ServletRequestAttributeListener监听request作用域的属性状态变化
HttpSessionListener监听session作用域的创建和销毁
HttpSessionAttributeListener监听session作用域的属性状态变化
ServletContextListener监听application作用域的创建和销毁
ServletContextAttributeListener监听application作用域的属性状态变化
HttpSessionBindingListener监听对象与session的绑定和解除
HttpSessionActivationListener监听session数值的钝化和活化

3.1 ServletRequestListener

在ServletRequestListener创建和关闭时都会通知ServletRequestListener监听器,常用方法如下:

方法声明功能介绍
void requestInitialized(ServletRequestEvent are)实现ServletRequest对象的初始化
void requestDestoryed(ServletRequestEvent are)实现ServletRequest对象的销毁

3.2 ServletRequestAttributeListener

向ServletRequest添加、删除或者替换一个属性的时候,将会通知ServletRequestAttributeListener监听器,常用方法如下:

方法声明功能介绍
void attributeAdded(ServletRequestAttributeEvent sra)增加属性时触发
void attributeReplaced(ServletRequestAttributeEvent sra)修改属性时触发
void attributeRemoved(ServletRequestAttributeEvent sra)删除属性时触发

3.3 HttpSessionListener

当一个HttpSession刚被创建或者失效的时候,将会通知HttpSessionListener监听器,常用方法如下:

方法声明功能介绍
void sessionCreated(HttpSessionEvent se)当一个HttpSession对象被创建时会调用这个方法
void sessionDestoryed(HttpSessionEvent se)当一个HttpSession超时或者调用HrrpSession的invalidate()方法让它销毁时,调用这个方法

3.4 HttpSessionAttributeListener

HttpSession中添加、删除或者替换一个属性的时候,将会通知HttpSessionAttributeListener监听器,常用方法如下:

方法声明功能介绍
void attributeAdded(HttpSessionBinndinngEvent se)当往会话中添加属性时调用
void attributeRemoved(HttpSessionBinndinngEvent se)从会话中删除属性时调用
void attributeReplaced(HttpSessionBinndinngEvent se)改变会话中的属性就会调用

3.5 ServletContextListener

ServletContext创建和关闭都回通知ServletContextListener监听器,常用方法如下:

方法声明功能介绍
void contextInnitialized(ServletContextEvent sce)当ServletContextEvent 创建的时候,将会调用这个方法
void contextDestoryed(ServletContextEvent see)当ServletContextEvent销毁的时候,将会调用这个方法

3.6 ServletContextAttributeListener

向ServletContext中添加、删除或者替换一个属性的时候,将会通知ServletContextAttributeListener监听器,常用方法如下:

方法声明功能介绍
void attributeAdded(ServletContextAttributeEvent se)往ServletContext中添加一个属性时触发
void attributeRemoved(ServletContextAttributeEvent se)往ServletContext中删除一个属性时触发
void attributeReplaced(ServletContextAttributeEvent se)改变ServletContext中的一个属性时触发

3.7 HttpSessionBindingListener

HttpSession中绑定和解除绑定时,将会通知HttpSessionBindingListener监听器,常用方法如下:

方法声明功能介绍
void valueBound(HttpSessionBindingEvent ev)有对象绑定时调用该方法
void valueUnbound(HttpSessionBindingEvent ev)对象解绑时调用该方法

3.8 HttpSessionActivationListener

当有session数值的钝化和活化操作时,将会通知HttpSessionActivationListener监听器,常用方法如下:

方法声明功能介绍
void sessionWillPassivate(HttpSessionnEVent se)有钝化操作时调用
void SesionDidActivate(HttpsSessionEvent se)有活化操作时调用

4 监听器案例

自定义类实现监听器接口并重写相关方法

public class OnlineUser implements HttpSessionListener,ServletContextListener{
  ServletContext ct=null;
  public void contextInitialized(ServletContextEvent e){
    ctx=e.getServletContext();
    
  }
  public void ContextDestoryed(ServletContextEvent e){
    ctx=null;
  }
  public sessionCreated(HttpSessionEvent hse){
    Object count=servletContext.getAttribute("count");
    if(null==count){
      servletContext.setAttribute("count",1);
    }
    else{
      Integer i=(Integer)count;
      i++;
      servletContext.setAttirbute("count",i);
    }
  }
  public void sessionDestoryed(HttpSessionEvent hte){
    System.out.println("用户已下线");
  }
}

在web.xml中配置监听器

<listener>
  <listeber-class>com.bjx.OnlineUser</listeber-class>
</listener>