Filter与Listener - 过滤器和监听器详解 轻松学习

过滤器Filter

Filter概述

  Filter(过滤器)是Java Web开发的三大组件之一(Servlet Filter Listener)
  一般用于对web资源进行拦截,做一些处理后再交给下一个过滤器或servlet处理

  最常用与解决乱码问题(配置全局拦截器,拦截所有请求,给request和response都设置编码,然后放行)

Filter过滤器生命周期

  1. init方法:服务器启动时就创建该Filter对象,执行init()方法
  2. doFilter方法:每当一个请求的路径是满足过滤器的配置路径,那么就会执行一次过滤器的doFilter()方法
  3. destory方法:服务器关闭的时候销毁Filter,执行destory()方法

Filter执行流程

在这里插入图片描述

  1. 浏览器发送请求,tomcat服务器将http请求转成request对象,http响应转response对象
  2. 通过访问url的地址查找,找到对应的Filter过滤器将request,resposne传给它的doFilter()方法
  3. 处理之后调用chain.doFilter(request,response)方法(放行,如果没有放行,则直接响应给浏览器,不继续往下执行)
  4. chain.doFilter()放行之后,找到对应的html、jsp、servlet,然后进行处理
  5. 处理完成之后将response返回给Filter,然后Filter执行后面的代码(doFilter()方法里面的)
  6. 执行完剩余代码之后,将reponse响应给 浏览器

doFilter()方法的内部执行顺序:
- 先执行doChain之前的代码,再执行doChain方法放行
- 再执行Servlet的doGet/doPost或者jsp、html代码
- 最后执行doChain之后的代码

Filter过滤器链 - 多个过滤器的执行流程(一路执行,再原路返回)

  多个 Filter 过滤器都对同一个 URL 进行拦截,这些 Filter 就会组成一个Filter 链,Filter 链用 FilterChain 对象表示。

  会依次调用过滤器处理,当过滤器有chain.doFilter(request,response)放行才会继续往后面的过滤器执行,否则返回响应。
在这里插入图片描述

执行顺序是:

浏览器 --> doFilter_1(chain.doFilter()方法) --> doFilter_2(chain.doFilter()方法) --> … --> doFilter_n(chain.doFilter()方法) --> 找到资源(Servlet,jsp,html等 ) --> doFilter_n剩余部分 --> … --> doFilter_2剩余部分 --> doFilter_1剩余部分 --> 最后响应给浏览器

Filter过滤器url-pattern路径匹配方式

1:完全路径匹配(名称完全相同才行)
	 @WebFilter("/user")	
	 @WebFilter("/user/hello")	
2:目录匹配(满足目录下的所有文件都匹配)
	 @WebFilter("/*")
	 @WebFilter("/user/*")
3:扩展名匹配(后缀扩展名相同就匹配)
	 @WebFilter("*.html")
	 @WebFilter("*.jsp")

Filter过滤器dispatcher属性【**】

  1. REQUEST:默认值,代表直接通过url地址访问某个资源时执行对应的Filter(重定向)
  2. FORWARD:通过请求转发的时候执行对应的Filter
    【dispatcher属性为默认值REQUEST的时候,就算url匹配,对应的Filter也是不会拦截 请求转发到这个url的方式】
@WebFilter(value = "/index.jsp",dispatcherTypes={
    
    DispatcherType.REQUEST,DispatcherType.FORWARD})

Filter案例 - 解决乱码问题 (一般Filter也是用于这个)

// 拦截所有请求,对所有请求的request、response做编码设置
@WebFilter("/*")
public class CharSetFilter implements Filter {
    
    

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
    
    
        //1、设置request、response编码
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=UTF-8");
        
        //2. 放行request和response
        chain.doFilter(req, resp);
    }
}

监听器Listener

监听器Listener概述

  • 监听器Listener是用来监听域对象(域对象ServletContext,HttpSession和ServletRequest【也就是监听的数据源】)
  • 监听哪个域就实现对应的接口就行

监听器类型

  1. 监听域对象自身的创建和销毁的事件监听器。
  2. 监听域对象中的属性的增加和删除的事件监听器。
  3. 监听绑定到HttpSession域中的某个对象的状态的事件监听器。

特点:

  • 不需要监听地址(不需要写路径,只需要注解 @WebListener() 表示这是一个监听器就行)

猜你喜欢

转载自blog.csdn.net/qq_40542534/article/details/108624930