过滤器/拦截器/监听器 —— Filter、Interceptor、Listener

一、Filter的功能

filter功能,它使用户可以改变一个 request和修改一个response. Filter 不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在离开 servlet时处理response.换种说法,filter其实是一个”servlet chaining”(servlet 链).

一个Filter包括:

1)在servlet被调用之前截获;

2)在servlet被调用之前检查servlet request;

3)根据需要修改request头和request数据;

4)根据需要修改response头和response数据;

5)在servlet被调用之后截获.

服务器每次只调用setFilterConfig方法一次准备filter 的处理;调用doFilter方法多次以处理不同的请求.FilterConfig接口有方法可以找到filter名字及初始化参数信息.服务器可以设置 FilterConfig为空来指明filter已经终结。

每一个filter从doFilter()方法中得到当前的request及response.在这个方法里,可以进行任何的针对request及 response的操作.(包括收集数据,包装数据等).filter调用chain.doFilter()方法把控制权交给下一个filter.一个 filter在doFilter()方法中结束.如果一个filter想停止request处理而获得对response的完全的控制,那它可以不调用下一个filter

例子:

首先新建一个Filter

public class LogFilter implements Filter {
    private FilterConfig filterConfig;
    public FilterConfig getFilterConfig() {
        System.err.println("...getFilterConfig...");
        return filterConfig;
    }
    public void setFilterConfig(FilterConfig filterConfig) {
        System.err.println("...setFilterConfig...");
        this.filterConfig = filterConfig;
    }
    @Override
    public void destroy() {
        System.err.println("...filter destroy...");
    }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {
        System.err.println("...doFilter...");
        chain.doFilter(request, response);//看到这没,这只要是传递下一个Filter
    }
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.err.println("...init Filter...");
        this.filterConfig = filterConfig;
    }
}

在web.xml里配置

<filter>
    <filter-name>LogFilter</filter-name>
    <filter-class>com.ee.filter.LogFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>LogFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping> 

启动运行

可以看到...init Filter...首先在TOMCAT启动时即被打印,然后在运行里面再看到...doFilter...被打印。

二、Listener功能

它是基于观察者模式设计的,Listener 的设计对开发 Servlet 应用程序提供了一种快捷的手段,能够方便的从另一个纵向维度控制程序和数据。目前 Servlet 中提供了 5 种两类事件的观察者接口,它们分别是:

4 个 EventListeners 类型的,ServletContextAttributeListener、ServletRequestAttributeListener、ServletRequestListener、HttpSessionAttributeListener ;

2 个 LifecycleListeners 类型的,ServletContextListener、HttpSessionListener。

Listener是Servlet的监听器,它可以监听客户端的请求、服务端的操作等。通过监听器,可以自动激发一些操作,比如监听在线的用户的数量。

常用的监听接口有以下几个:

1、ServletContextAttributeListener监听对ServletContext属性(增/删/改)的操作。

2、ServletContextListener监听ServletContext的操作:

  • 当创建ServletContext时,激发contextInitialized(ServletContextEvent sce)方法;
  • 当销毁ServletContext时,激发contextDestroyed(ServletContextEvent sce)方法。

3、HttpSessionListener监听HttpSession的操作:

  • 当创建一个Session时,激发session Created(HttpSessionEvent se)方法(这样就可以给在线人数+1);
  • 当销毁一个Session时,激发sessionDestroyed (HttpSessionEvent se)方法。

4、HttpSessionAttributeListener监听HttpSession中的属性的操作。

  • 当在Session增加一个属性时,激发attributeAdded(HttpSessionBindingEvent se) 方法;
  • 当在Session删除一个属性时,激发attributeRemoved(HttpSessionBindingEvent se)方法;
  • 当在Session属性被重新设置时,激发attributeReplaced(HttpSessionBindingEvent se) 方法。

下面我们开发一个具体的例子,这个监听器能够统计在线的人数。在ServletContext初始化和销毁时,在服务器控制台打印对应的信息。当ServletContext里的属性增加、改变、删除时,在服务器控制台打印对应的信息。

要获得以上的功能,监听器必须实现以下3个接口:

  • HttpSessionListener
  • ServletContextListener
  • ServletContextAttributeListener

例子:

public class OnlineUserListener implements HttpSessionListener, ServletContextListener, ServletContextAttributeListener {
    private long onlineUserCount = 0;
    public long getOnlineUserCount() {
        return onlineUserCount;
    }
    @Override
    public void attributeAdded(ServletContextAttributeEvent arg0) {  

    }
    @Override
    public void attributeRemoved(ServletContextAttributeEvent arg0) {  

    }
    @Override
    public void attributeReplaced(ServletContextAttributeEvent attributeEvent) {
        System.err.println("...attributeReplaced...");
    }
    @Override
    public void contextDestroyed(ServletContextEvent arg0) {  

    }
    @Override
    public void contextInitialized(ServletContextEvent arg0) {  

    }
    @Override
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
        onlineUserCount ++;
        toUpdateCount(httpSessionEvent);
    }
    @Override
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
        onlineUserCount --;
        toUpdateCount(httpSessionEvent);
    }
    private void toUpdateCount(HttpSessionEvent httpSessionEvent){
        httpSessionEvent.getSession().setAttribute("onlineUserCount", onlineUserCount);
    }
}

Web.xml

<listener>
    <listener-class>com.ee.listener.OnlineUserListener</listener-class>
</listener>

JSP页面:

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>主页</title>
    </head>
    <body>
        <h4>你好!</h4>
        在线人数:<h1><%=request.getSession().getAttribute("onlineUserCount") %></h1>
    </body>
</html> 

原文地址:https://www.cnblogs.com/yifanSJ/p/9217365.html

时间: 2024-08-27 11:03:34

过滤器/拦截器/监听器 —— Filter、Interceptor、Listener的相关文章

SpringBoot 过滤器, 拦截器, 监听器 对比及使用场景

1. 过滤器 (实现 javax.servlet.Filter 接口) ① 过滤器是在web应用启动的时候初始化一次, 在web应用停止的时候销毁. ② 可以对请求的URL进行过滤, 对敏感词过滤, ③ 挡在拦截器的外层 ④ Filter 是 Servlet 规范的一部分 2. 拦截器 (实现 org.springframework.web.servlet.HandlerInterceptor 接口) ① 不依赖Spring容器, 可以使用 Spring 容器管理的Bean ② 拦截器通过动态代

过滤器 拦截器 区别

转 http://www.cnblogs.com/wangyuyu/archive/2013/07/02/3167354.html 1.拦截器是基于java的反射机制的,而过滤器是基于函数回调 2.过滤器依赖与servlet容器,而拦截器不依赖与servlet容器 3.拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用 4.拦截器可以访问action上下文.值栈里的对象,而过滤器不能 5.在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次

自定义拦截器和Filter的执行顺序

自定义拦截器 Spring MVC也可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义的拦截器必 须实现HandlerInterceptor接口 1.自定义实现类实现 HandlerInterceptor接口 2.在springmvc配置文件中配置相对应的拦截器 <mvc:interceptors> <!--配置自定义拦截器 ,所有的路径都拦截 --> <bean class="com.neuedu.springmvc.filter.My

拦截器与Filter的区别

拦截器与过滤器的调用顺序 只是借助这个平台将自己看到的感觉有用的知识做个记录,以防止以后用到的时候想不起来.

servlet 拦截器 (filter)

使用: 创建一个类实现javax.servlet.Filter接口,并重写接口中所有的方法: 在web.xml配置所需要拦截的请求. 过程说明: 1>在应用启动的时候就进行装载Filter类(与Servlet的load-on-startup配置效果相同) 2>容器创建好Filter对象实例后,调用init()方法.接着被Web容器保存进应用级的集合容器中去了等待着,用户访问资源. 3>当用户访问的资源正好被Filter的url-pattern拦截时,容器会取出Filter类调用doFil

【springboot】过滤器、监听器、拦截器,Aspect切片

转自: https://blog.csdn.net/cp026la/article/details/86501019 简介: 本章介绍拦截器.过滤器.切片对请求拦截的使用与区别,以及监听器在 springboot1.5 中的简单使用 过滤器.拦截器.切片拦截请求的对比: 相同点: 都可以对请求进行拦截.不同点:1.过滤器对请求的拦截只能获取到原始的Request 和 Response 的信息.2.拦截器对请求的拦截可以获取原始的Request.Response和所有的controller及方法名

java 拦截器、过滤器、监听器

转自:http://www.cnblogs.com/wangyuyu/archive/2013/07/02/3167354.html 一.理解Struts2拦截器 1. Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现. 2. 拦截器栈(Interceptor Stack).Struts2拦截器栈就是将拦截器按一定的顺序联结成一条链.在访问被拦截的方法或字段时,Struts2拦截器链中的拦截

拦截器 过滤器 监听器的使用简介

java 拦截器.过滤器.监听器 一.理解Struts2拦截器 1. Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现. 2. 拦截器栈(Interceptor Stack).Struts2拦截器栈就是将拦截器按一定的顺序联结成一条链.在访问被拦截的方法或字段时,Struts2拦截器链中    的拦截器就会按其之前定义的顺序被调用. 二.实现Struts2拦截器原理 Struts2拦截器的实

JavaWeb过滤器.监听器.拦截器-?原理&amp;区别

1.拦截器是基于java的反射机制,过滤器是基于函数回调 2.拦截器不依赖与servlet容器,过滤器依赖与servlet容器3.拦截器只能对action请求起作用,过滤器则可以对几乎所有的请求起作用 4.拦截器可以访问action上下文.值栈里的对象,而过滤器不能 5.在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次 拦截器 :是在面向切面编程的就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法比如动态代理就是拦截器的简单实现,