Filter过滤器

1.什么是Filter(过滤器)?
2.编写Filter
3.Filter生命周期
4.多个Filter执行顺序
5.FilterConfig对象

#什么是Filter(过滤器)?
Filter过滤器是servlet中提供的一个接口,用来拦截请求和响应,从而实现一些特殊处理
Filter过滤器

#编写Filter
只需要实现javax.servlet.Filter 接口即可

package com.mike;

import javax.servlet.*;
import java.io.IOException;
/**
 * @author mike
 * @date 2020-11-21
 * @desc 实现一个Filter类
 */

public class MyFilter implements Filter {
	@Override
	public void init(FilterConfig filterConfig)throws ServletException{
		System.out.println("Filter初始化");
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response,FilterChain filterChain)throws ServletException,
	IOException{
		request.setCharacterEncoding("UTF-8");
		response.setCharacterEncoding("UTF-8");
		response.setContentType("text/html");
		System.out.println("拦截前"); //在过滤前设置请求和响应编码
		filterChain.doFilter(request,response);
		System.out.println("拦截后");
	}
}

在web.xml中配置过滤器规则

   <!--配置过滤器-->
    <filter>
        <filter-name>MyFilter</filter-name>
        <filter-class>com.mike.MyFilter</filter-class>
    </filter>
    <!--映射过滤器-->
    <filter-mapping>
        <filter-name>MyFilter</filter-name>
        <!--/* 表示拦截所有请求-->
        <url-pattern>/*</url-pattern>
    </filter-mapping>

随便访问一个servlet,如http://localhost:8080/helloServlet 观察输出信息
Filter过滤器

#Filter生命周期
在Filter接口中定义了三个方法

package javax.servlet;

import java.io.IOException;

public interface Filter {
    void init(FilterConfig var1) throws ServletException;

    void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException;

    void destroy();
}

对于这三个方法的介绍:
init(FilterConfig var1):表示Filter对象的初始化方法,在Filter对象创建时执行(只执行一次),并且传入一个FilterConfig类型的参数,该参数封装了Filter的初始化参数。
doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3):表示Filter执行过滤的核心方法,如果某资源在已经被配置到这个Filter进行过滤的话,那么每次访问这个资源都会执行doFilter方法,注意 这里的request和response没有http需要强制转换。
destory():表示Filter销毁方法,当Filter对象销毁时执行该方法(仅执行一次)。

#多个Filter执行顺序
编写多个Filter可以组成Filter链条,web容器会按照一定的顺序执行。当在web.xml中定义Filter规则时,容器会按照配置先后顺序执行,如果使用注解配置则按照类名先后执行。当分别在web.xml和注解中都有配置,则先从web.xml中加载,再从注解中加载,第一个Filter的doFilter方法被调用时,Web服务器会创建一个代表Filter链的FilterChain对象传递给该方法。在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则Web服务器会检查FilterChain对象中是否还有Filter,如果还有,则调用第2个Filter,依次类推,直到没有可以调用目标资源。当有4个Filter,CFilter,BFilter,AFilter,DFilter,其中C,B使用注解,A,D使用web.xml定义,它们的执行顺序,如下
Filter过滤器

上一篇:Servlet——Filter过滤器


下一篇:java实现责任链模式的小demo