上一篇博客的传送门:Servlet 入门到精通(五)
Servlet Filter 又称 Servlet 过滤器,它是在 Servlet 2.3 规范中定义的,是 Servlet 中的一个组件,是设计模式中责任链模式的一种经典实现。能够对 Servlet 容器传给 Web 资源的请求和响应进行校验。
过滤器的实现
过滤器和 Servlet 的实现方式比较相似,也有三种实现:
- 实现 Filter 接口
- 继承 GenericFilter 抽象类
- 继承 HttpFilter 类
其中我们比较常见的就是第三种实现,它是针对于 Http 协议的一种过滤方式。
过滤器在注册时也有 XML 和注解的方式,这里我们只演示注解方式。
实现 Filter 接口
@WebFilter(value = "/*")
public class FirstFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain)
throws IOException, ServletException {
}
public void init(FilterConfig filterConfig) throws ServletException {
}
}
继承 GenericFilter 抽象类
@WebFilter(value = "/*")
public class SecondFilter extends GenericFilter {
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain)
throws IOException, ServletException {
}
}
继承 HttpFilter 类
@WebFilter(value = "/*")
public class ThirdFilter extends HttpFilter {
@Override
protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
throws IOException, ServletException {
}
}
过滤器的方法
1.init初始化方法
在 web 工程启动的时候执行,此时该 Filter 对象已经创建。
2.doFilter 过滤方法
只要请求资源的路径和拦截的路径相同,那么过滤器就会对请求进行过滤,这个阶段在服务器运行过程中会一直循环。其中会传递三个参数:request 对象、response对象和 filterChain 对象。前两个参数我们都了解了,那么 filterChain 是什么作用呢?它其实是对拦截进行放行的方法。
3.destroy 销毁
当服务器关闭时,就会执行。
@WebFilter 注解
@WebFilter 注解可以对过滤器进行配置,容器在部署应用时,会根据其具体属性配置将相应的类部署为过滤器。
过滤器的业务流程
过滤器的流程
- 客户端请求访问容器内的 Web 资源。
- Servlet 容器接收请求,并针对本次请求分别创建一个 request 对象和 response 对象。
- 请求到达 Web 资源之前,先调用 Filter 的 doFilter() 方法,检查 request 对象,修改请求头和请求正文,或对请求进行预处理操作。
- 在 Filter 的 doFilter() 方法内,调用 FilterChain.doFilter() 方法,将请求传递给下一个过滤器或目标资源。
- 目标资源生成响应信息返回客户端之前,处理控制权会再次回到 Filter 的 doFilter() 方法,执行 FilterChain.doFilter() 后的语句,检查 response 对象,修改响应头和响应正文。
- 响应信息返回客户端。
过滤器的生命周期
过滤器的生命周期分为三个阶段:
- 初始化阶段
- 拦截和过滤阶段
- 销毁阶段
初始化阶段
Servlet 容器负责加载和实例化 Filter。容器启动时,读取 web.xml 或 @WebFilter 的配置信息对所有的过滤器进行加载和实例化。加载和实例化完成后,Servlet 容器调用 init() 方法初始化 Filter 实例。在 Filter 的生命周期内, init() 方法只执行一次。
拦截和过滤阶段
该阶段是过滤器生命周期中最重要的阶段。当客户端请求访问 Web 资源时,Servlet 容器会根据过滤规则进行检查。当客户端请求的 URL 与过滤器映射匹配时,容器将该请求的 request 对象、response 对象以及 FilterChain 对象以参数的形式传递给 Filter 的 doFilter() 方法,并调用该方法对请求/响应进行拦截和过滤。
销毁阶段
Filter 对象创建后会驻留在内存中,直到容器关闭或应用被移除时销毁。销毁 Filter 对象之前,容器会先调用 destory() 方法,释放过滤器占用的资源。在 Filter 的生命周期内,destory() 只执行一次。
过滤器链
过滤器的作用
过滤器的适用场景
过滤器的应用
- 过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息,也就是说可以监视,修改或以某种方式处理客户端与服务端下在交流的数据。
- 过滤器是可用于 Servlet 编程的 Java 类,可以实现以下目的:
- 在客户端的请求访问后端资源之前,拦截这些请求。
- 在服务器的响应发送回客户端之前,处理这些响应。