6、Filter

Filter

工作流程

image-20230529134558112

生命周期

  1. 当服务器启动的时候,Filter对象会被创建,并且调用init()方法
  2. 当我们通过浏览器请求Servlet的时候,Servlet对象会被创建,并且调用init()方法,然后调用过滤器的doFilter()方法对请求过滤,然后再调用servlet的service()方法,然后再调用过滤器的doFilter()方法对响应过滤
  3. 当我们多次访问Servlet的时候,只会重复的调用filter的doFilter()方法和Servlet的service()方法
  4. 当我们正常的关闭服务器的时候,会先执行Servlet的destroy()方法,然后再执行Filter的destroy()方法

过滤器的实现

1、实现javax.servlet.Filter接口

package top.ygang.filters;

import javax.servlet.*;
import java.io.IOException;

public class MyFilter implements Filter {
  	@Override  
    public void init(FilterConfig arg0) throws ServletException {  
    	// 初始化方法,接受一个 FilterConfig 的参数,该参数是对Filter的配置,在服务器启动时自动调用
        // 一般不用实现该方法
    }  
    
    @Override  
    public void destroy() {  
    	// 服务器关闭时调用,释放Filter占用的资源
        // 一般不用实现该方法
    }  
  
    @Override  
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {
    	// 过滤方法,对 Resquest 与 Response 对象进行处理,之后交给其他Filter或服务器端
        // 如果符合过滤规则则通过chain.doFilter(request,response);进行放行
    }  
}

2、配置过滤器拦截规则

url-pattern的配置(配置拦截路径)

方式一:通过web.xml文件

<filter>
    <!-- 配置过滤器名称,一般为Filter实现类类名 -->
    <filter-name>MyFilter</filter-name>
    <!-- 配置过滤器实现类全类名 -->
    <filter-class>top.ygang.filters.MyFilter</filter-class>
</filter>
<!-- 指定过滤器规则 -->
<filter-mapping>
    <!-- 规则所属的过滤器 -->
    <filter-name>MyFilter</filter-name>
    <!-- 过滤器拦截路径 -->
    <filter-pattern>/*</filter-pattern>
</filter-mapping>

方式二:通过注解@WebFilter

@WebFilter({"/login.jsp","/auth.jsp"})

配置多个过滤器(过滤器链)

过滤相同资源时执行的先后顺序

使用举例

过滤字符,防止中文乱码

如果是tomcat8之前的版本,该方法只可以解决post请求的乱码处理

@WebFilter("/*")
public class CharacterFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        request.setCharacterEncoding("utf-8");
        chain.doFilter(request,response);
    }
}