> 文章列表 > Servlet 入门到精通(六)

Servlet 入门到精通(六)

Servlet 入门到精通(六)

上一篇博客的传送门: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 {@Overridepublic void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException {}
}

继承 HttpFilter 类

@WebFilter(value = "/*")
public class ThirdFilter extends HttpFilter {@Overrideprotected 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 注解可以对过滤器进行配置,容器在部署应用时,会根据其具体属性配置将相应的类部署为过滤器。

过滤器的业务流程

过滤器的流程

  1. 客户端请求访问容器内的 Web 资源。
  2. Servlet 容器接收请求,并针对本次请求分别创建一个 request 对象和 response 对象。
  3. 请求到达 Web 资源之前,先调用 Filter 的 doFilter() 方法,检查 request 对象,修改请求头和请求正文,或对请求进行预处理操作。
  4. 在 Filter 的 doFilter() 方法内,调用 FilterChain.doFilter() 方法,将请求传递给下一个过滤器或目标资源。
  5. 目标资源生成响应信息返回客户端之前,处理控制权会再次回到 Filter 的 doFilter() 方法,执行 FilterChain.doFilter() 后的语句,检查 response 对象,修改响应头和响应正文。
  6. 响应信息返回客户端。

过滤器的生命周期

过滤器的生命周期分为三个阶段:

  1. 初始化阶段
  2. 拦截和过滤阶段
  3. 销毁阶段

初始化阶段

Servlet 容器负责加载和实例化 Filter。容器启动时,读取 web.xml 或 @WebFilter 的配置信息对所有的过滤器进行加载和实例化。加载和实例化完成后,Servlet 容器调用 init() 方法初始化 Filter 实例。在 Filter 的生命周期内, init() 方法只执行一次。

拦截和过滤阶段

该阶段是过滤器生命周期中最重要的阶段。当客户端请求访问 Web 资源时,Servlet 容器会根据过滤规则进行检查。当客户端请求的 URL 与过滤器映射匹配时,容器将该请求的 request 对象、response 对象以及 FilterChain 对象以参数的形式传递给 Filter 的 doFilter() 方法,并调用该方法对请求/响应进行拦截和过滤。

销毁阶段

Filter 对象创建后会驻留在内存中,直到容器关闭或应用被移除时销毁。销毁 Filter 对象之前,容器会先调用 destory() 方法,释放过滤器占用的资源。在 Filter 的生命周期内,destory() 只执行一次。

过滤器链

过滤器的作用

过滤器的适用场景

过滤器的应用

  1. 过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息,也就是说可以监视,修改或以某种方式处理客户端与服务端下在交流的数据。
  2. 过滤器是可用于 Servlet 编程的 Java 类,可以实现以下目的:
    1. 在客户端的请求访问后端资源之前,拦截这些请求。
    2. 在服务器的响应发送回客户端之前,处理这些响应。