在web中的过滤器可以对游览器的请求进行过滤,对请求进行拦截,然后做出相应小狐狸,实现很多特殊功能,例如:登录控制,权限管理,过滤敏感词汇等
当我们使用过滤器的时候,过滤器会对游览器的请求进行过滤,过滤器可以动态的分为3个部分

实现Filter的时候,要继承Filter接口

我们来看一下Filter接口里面有什么东西:

首先可以看到是servlet这个包里面的,不能搞错了。
然后里面有三个方法,init, doFilter, destroy
doFilter方法没有实现,所以我们必须要重写doFilter方法。
@Slf4j
@WebFilter(filterName = "AFilter", urlPatterns = "/*")
public class TestFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("对request进行过滤");
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("对response进行过滤");
}
}
我们随意输入一个url地址。

于是我们得出结论,过滤器并不会管资源是否存在,只会对配置的拦截路径进行拦截。拦截不仅会对请求进行拦截, 而且会对响应进行拦截

urlPatterns和value是一样的,只能配置一个,不然就会出错
<filter>
<filter-name>myFilterfilter-name>
<filter-class>com.example.reggie_delivery.TestFilterfilter-class>
filter>
<filter-mapping>
<filter-name>AFilterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
Filter有三个阶段

import javax.servlet.*;
import java.io.IOException;
import java.util.Enumeration;
public class MyFilterConfig implements Filter {
import javax.servlet.*;
import java.io.IOException;
import java.util.Enumeration;
public class MyFilterConfig implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("-----------获取全部key:value------------");
//得到所有配置参数的名字
Enumeration<String> names = filterConfig.getInitParameterNames();
while (names.hasMoreElements()) {
//得到每一个名字
String name = names.nextElement();
System.out.println(name+" = "+filterConfig.getInitParameter(name));
}
System.out.println("-----------end.....------------");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
}
@Override
public void destroy() {
}
}
xml配置
<filter>
<filter-name>myFilterConfigfilter-name>
<filter-class>com.clucky.filter.MyFilterConfigfilter-class>
<init-param>
<param-name>driverparam-name>
<param-value>com.mysql.jdbc.Driverparam-value>
init-param>
<init-param>
<param-name>urlparam-name>
<param-value>jdbc:mysql://localhost:3306/equip_employ_manage?serverTimezone=GMTparam-value>
init-param>
<init-param>
<param-name>usernameparam-name>
<param-value>rootparam-value>
init-param>
<init-param>
<param-name>passwordparam-name>
<param-value>rootparam-value>
init-param>
filter>
<filter-mapping>
<filter-name>myFilterConfigfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>

所以FilterConfig就是用来读取配置文件的。
用一张图简要的表明:

强转成

HttpServletRequest和HttpServletResponse
然后就可以使用他们的方法了。
filterChain.doFilter()方法可以让Filter进入下一个Filter继续进行过滤。

多个Filter的执行顺序:
<filter>
<filter-name>filter03filter-name>
<filter-class>com.clucky.filter.Filter03filter-class>
filter>
<filter-mapping>
<filter-name>filter03filter-name>
<url-pattern>/*url-pattern>
filter-mapping>
<filter>
<filter-name>filter01filter-name>
<filter-class>com.clucky.filter.Filter01filter-class>
filter>
<filter-mapping>
<filter-name>filter01filter-name>
<url-pattern>/*url-pattern>
filter-mapping>
<filter>
<filter-name>filter02filter-name>
<filter-class>com.clucky.filter.Filter02filter-class>
filter>
<filter-mapping>
<filter-name>filter02filter-name>
<url-pattern>/*url-pattern>
filter-mapping>
最后在SpringBoot的启动函数上面要加上@ServletComponentScan注解