JavaWeb Filter、 Listener 学习笔记

90 阅读3分钟

Filter过滤器

Filter本意为”过滤“的含义,是JavaWeb的三大组件之一,三大组件为:Servlet、Filter、 Listener

过滤器是向 Web 应用程序的请求和响应处理添加功能的 Web 服务组件

过滤器相当于浏览器与Web资源之间的一道过滤网,在访问资源之前通过一系列的过滤器对请求 进行修改、判断以及拦截等,也可以对响应进行修改、判断以及拦截等

使用方式

自定义类实现Filter接口并重写doFilter方法,通过是否调用chain.doFilter(request,response)来进行控制,调用时才会把过滤器的运行交给下一步

public class LoginFilter implements Filter {
  @Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    if () { ... } else {
      chain.doFilter(servletRequest, servletResponse)    }
  }
}

在web.xml文件中配置过滤器

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

Filter接口

javax.servlet.Filter接口主要用于描述过滤器对象,可以对资源的请求和资源的响应操作进行筛选操作

  • void init(FilterConfig filterConfig)     实现过滤器的初始化操作
  • void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)  执行过滤操作的功能
  • void destroy()    实现过滤器的销毁操作

多个过滤器的使用

在web.xml文件中配置过滤器,如果有多个过滤器都满足过滤的条件,按照<filter-mapping>的顺序从上往下

<filter>
    <filter-name>LoginFilter</filter-name>
    <filter-class>com.test.filter.LoginFilter</filter-class></filter>
    <filter-mapping>
        <filter-name>LoginFilter1</filter-name>
        <url-pattern>*.jsp</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>LoginFilter2</filter-name>
        <url-pattern>*.jsp</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>LoginFilter3</filter-name>
        <url-pattern>*.jsp</url-pattern>
    </filter-mapping></filter>

Listener监听器

Servlet规范中定义的一种特殊的组件,用来监听Servlet容器产生的事件并进行相应的处理

容器产生的事件分类

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

基本分类

  • javax.servlet.ServletRequestListener                    监听request作用域的创建和销毁
  •  javax.servlet.ServletRequestAttributeListener    监听request作用域的属性状态变化
  •  javax.servlet.http.HttpSessionListener                监听session作用域的创建和销毁
  •  javax.servlet.http.HttpSessionAttributeListener  监听session作用域的属性状态变化
  •  javax.servlet.ServletContextListener                   监听application作用域的创建和销毁
  •  javax.servlet.ServletContextAttributeListener   监听application作用域的属性状态变化
  •  javax.servlet.http.HttpSessionBindingListener     监听对象与session的绑定和解除
  •  javax.servlet.http.HttpSessionActivationListener  监听session数值的钝化和活化

ServletRequestListener监听器

在ServletRequest创建和关闭时都会通知ServletRequestListener监听器

public class MyRequestListener implements ServletRequestListener {
    @Override
    public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
        System.out.println("请求销毁了...");
    }
    @Override    public void requestInitialized(ServletRequestEvent servletRequestEvent) {
        System.out.println("创建请求...");
    }
}

ServletRequestAttributeListener监听器

向ServletRequest添加、删除或者替换一个属性的时候,将会通知ServletRequestAttributeListener监听器

public class MyRequestAttributeListener implements ServletRequestAttributeListener {
    @Override    public void attributeAdded(ServletRequestAttributeEvent servletRequestAttributeEvent) {
        System.out.println("增加了属性" + servletRequestAttributeEvent.getName());
    }    @Override    public void attributeRemoved(ServletRequestAttributeEvent servletRequestAttributeEvent) {
        System.out.println("属性" + servletRequestAttributeEvent.getName() + "被删除了" );
    }    @Override    public void attributeReplaced(ServletRequestAttributeEvent servletRequestAttributeEvent) {
        System.out.println("修改属性" + servletRequestAttributeEvent.getName());
    }
}

HttpSessionListener监听器

当一个HttpSession刚被创建或者失效(invalidate)的时候,将会通知HttpSessionListener监听器

public class MySessionListener implements HttpSessionListener {
    @Override    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
        System.out.println("创建了session...");
    }
    @Override    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
        System.out.println("session销毁!");
    }
}

HttpSessionAttributeListener监听器

HttpSession中添加、删除或者替换一个属性的时候,将会通知HttpSessionAttributeListener监听器

public class MySessionAttributeListener implements HttpSessionAttributeListener {
    @Override    public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("增加了属性" + httpSessionBindingEvent.getName());
    }    @Override    public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("属性" + httpSessionBindingEvent.getName() + "被删除!");
    }    @Override    public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("修改属性" + httpSessionBindingEvent.getName());
    }
}

ServletContextListener监听器

在ServletContext创建和关闭时都会通知ServletContextListener监听器

public class MyContextListener implements ServletContextListener {
    @Override    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("ServletContext对象创建了...");
    }
    @Override    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("销毁ServletContext对象...");
    }
}

ServletContextAttributeListener监听器

向ServletContext添加、删除或者替换一个属性的时候,将会通知 ServletContextAttributesListener监听器

public class MyContextAttributeListener implements ServletContextAttributeListener {
    @Override    public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {
        System.out.println("增加了属性" + servletContextAttributeEvent.getName());
    }
    @Override    public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {
        System.out.println("属性" + servletContextAttributeEvent.getName() + "被删除!");
    }
    @Override    public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {
        System.out.println("修改属性" + servletContextAttributeEvent.getName());
    }
}

HttpSessionBindingListener监听器

HttpSession中绑定和解除绑定时,将会通知HttpSessionListener监听器

当前对象被放入session或从session移除时触发

public class Person implements HttpSessionBindingListener {
    @Override    public void valueBound(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("对象绑定到session中了" + httpSessionBindingEvent.getName());
    }
    @Override    public void valueUnbound(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("解除绑定成功!");
    }
}