1. Filter简介
Filter,过滤器,顾名思义,用于过滤东西的,在JavaWeb中的过滤器位于客户端和后端服务器资源之间,过滤客户端发送过来的请求。
在java中常用于权限拦截,放行符合条件的请求,如,对于某些敏感资源,需要携带token或者需要登陆后才可以访问,如果请求没有携带token或没有登陆,则拦截不允许访问,否则放行请求。
也用于做功能增强,在某些请求中,想要记录请求的ip,请求参数等,可以在过滤器中添加相关逻辑实现,因为操作粒度的问题,目前springmvc的拦截器使用更多一点。
注意,拦截器是一项Servlet技术,它和servlet以及servletListener是servlet的三大最重要组件。它依赖于tomcat等web容器。
2. 过滤器使用
2.1 springboot配置过滤器
2.1.1 创建拦截器类
先创建Filter类Filter1,实现Filter接口,注意这里实现的接口是servlet下的,它是一项servlet技术。
package com.william.filter;
import javax.servlet.*;
import java.io.IOException;
public class Filter1 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
}
@Override
public void destroy() {
Filter.super.destroy();
}
}
2.1.2 重写方法
Filter接口中定义了三个方法,init/doFilter/destory,它们就是过滤器的生命周期方法。
init在filter初始化阶段被调用,destroy在filter摧毁的时候调用,整个生命周期中都只会被调用一次。
doFilter方法是最重要的方法,他在过滤请求的时候调用,默认传入的参数中我们可以拿到请求中携带的所有参数以及请求返回的所有参数。
一般init方法和destroy方法很少使用,doFilter方法使用最多,过滤器的业务基本都是围绕着这个方法展开的。
2.2.3 doFilter方法
doFilter方法的默认参数中,servletRequest和servletResponse不必多说,是当前请求的请求对象和返回对象
filterChain是过滤器链,暂时可以理解为由多个filter组成的一个链子,责任链设计模式的体现。
在当前过滤器执行完之后,如果放行,则调用filterChain的doFilter方法,执行下一个过滤器的逻辑,这里需要传入 servletRequest和servletResponse对象,我们可以将处理后的这两个对象传进去实现业务增强。