什么是 Filter

Filter 可以拦截请求和响应,在请求到达 Servlet 程序前,进行预处理,如鉴权,修改 Http 请求头,拦截返回,加入自己的逻辑

Filter 如何实现拦截

  • 当客户端发生请求后,在 HttpServletRequest 到达 Servlet 之前,过滤器拦截客户的 HttpServletRequest 。
  • 根据需要检查 HttpServletRequest ,也可以修改 HttpServletRequest 头和数据。
  • 在过滤器中调用 doFilter 方法,对请求放行。请求到达 Servlet 后,对请求进行处理并产生 HttpServletResponse 发送给客户端。
  • 在 HttpServletResponse 到达客户端之前,过滤器拦截 HttpServletResponse 。
  • 根据需要检查 HttpServletResponse ,可以修改 HttpServletResponse 头和数据。
  • 最后,HttpServletResponse 到达客户端。

生命周期

方法

  • init()方法:初始化参数,在创建 Filter 时自动调用。当我们需要设置初始化参数的时候,可以写到该方法中。
  • doFilter()方法:拦截到要执行的请求时,doFilter 就会执行。这里面写我们对请求和响应的预处理。
  • destroy()方法:在销毁 Filter 时自动调用。

生命周期

Filter 的创建和销毁由 web 服务器控制。

  • 服务器启动的时候,web 服务器创建 Filter 的实例对象,并调用其 init 方法,完成对象的初始化功能。filter 对象只会创建一次,init 方法也只会执行一次。
  • 拦截到请求时,执行 doFilter 方法。可以执行多次。
  • 服务器关闭时,web 服务器销毁 Filter 的实例对象。

FilterConfig

用 户在配置 filter 时,可以使用为 filter 配置一些初始化参数,当 web 容器实例化 Filter 对象,调用其 init 方法时,会把封装了 filter 初始化参数的 filterConfig 对象传递进来。因此开发人员在编写 filter 时,通过 filterConfig 对象的方法,就可获得:

  • String getFilterName():得到 filter 的名称。
  • String getInitParameter(String name): 返回在部署描述中指定名称的初始化参数的值。如果不存在返回 null.
  • Enumeration getInitParameterNames():返回过滤器的所有初始化参数的名字的枚举集合。
  • public ServletContext getServletContext():返回 Servlet 上下文对象的引用。

FilterChain

如果有多个 Filter,则请求会按照 web.xml 里 filtermapping 的先后顺序将请求发给 filter,直到,没有下一个 filter 了,请求会被转给 Servlet