概述:
Filter是Javaweb三大组件(Serclet 、Filter、Listener)之一,可以把对资源的请求拦截下来,实现一些特殊的功能,例如:登录校验、统一编码处理、敏感字符处理等
Filter初体验
Filter 过滤器的使用步骤:
1、定义Filter:定义一个类,实现Filter接口,并重写其所有方法。
2、配置Filter:配置Filter的拦截路径,有两种方式:一种是注解,一种是xml方式,我们在这里针对注解进行讲解。在@WebFilter注解里面配置项有许多,我们就不一一演示了,简略介绍在下方,仅供参考:
- filterName:该filter的名字
- initParams:初始化参数
- displayName:filter显示名称
- servletNames:指定对哪些servlet进行过滤
- asyncSupported:是否支持异步模式
- urlPatterns:指定拦截路径
- value:指定拦截路径
@WebFilter(urlPatterns = {"/*","/login"})//拦截请求路径,可配置多个,加花括号用逗号隔开,/*拦截所有请求
public class filter implements Filter {
@Override//初始化方法,web服务器启动,创建Filter时调用,只调用一次
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("init 初始化方法执行了");
}
@Override//拦截到请求时,调用方法,可以调用多次
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("拦截到了请求");
//放行操作,只有放行了之后才能访问到对应的资源
filterChain.doFilter(servletRequest,servletResponse);
}
@Override//销毁方法时,服务器关闭调用,只调用一次
public void destroy() {
System.out.println("destroy 销毁方法执行了");
}
}
要想使用Javaweb的三大组件,还要在他的启动类上加上@ServletComponentScan代表对servlet
组件的支持
注意:urlPatterns和value是一样的。urlPatterns和value只能配置一个,不能两个都配置,两个都配置就会报错。
Filter拦截路径
Filter可以根据需要,配置不同的拦截资源路径
拦截路径 | urlPatterns值 | 含义 |
拦截具体路径 | /login | 只有访问/login路径时,才会被拦截 |
目录拦截 | /demo/* | 访问/demo下的所有资源,都会被拦截 |
拦截所有 | /* | 访问所有资源,都会被拦截 |
过滤器链
介绍:
在一个 Web 应用程序中可以注册多个 Filter 程序,每个 Filter 程序都可以针对某一个 URL 进行拦截。如果多个 Filter 程序都对同一个 URL 进行拦截,那么这些 Filter 就会组成一个Filter 链(也称过滤器链)
过滤器链的使用步骤:
1、创建多个过滤器
① ABC
package com.example.Filter;
import javax.servlet.*;
import java.io.IOException;
public class ABC implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("ABC拦截到了请求");
filterChain.doFilter(servletRequest,servletResponse);
}
}
② Demo
package com.example.Filter;
import javax.servlet.*;
import java.io.IOException;
public class Demo implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("Demo拦截到了请求");
filterChain.doFilter(servletRequest,servletResponse);
}
}
2、运行项目并查看结果
过滤器链执行顺序
执行顺序和类名字符排序有关!
将ABC类名修改成XBC之后,运行项目并查看结果
发现确实改变了,Filter的执行顺序