Servlet API 提供一个 Filter 接口,实现该接口的 Java 类则称为过滤器。Filter 主要用于对用户请求 HttpServletRequest 进行预处理,能够对客户端和服务器端消息的过滤,也可以对 HttpServletResponse 进行后处理。在实际项目中, Filter 里 doFilter() 方法里的代码就是从多个 Servlet 的 service() 方法里抽取的通用代码,通过使用 Filter 可以实现更好的代码复用。
Web 服务器根据 Filter 在 web.xml 文件中的注册顺序决定先调用哪个 Filter。

java filter 返回消息 java中的filter怎么用_filter

Filter 的方法详解

1、 init(FilterConfig filterConfig)
和 Servlet 程序一样, Filter 的创建和销毁由 Web 服务器负责。Web 应用程序启动时, Web 服务器将创建 Filter 的实例对象,并调用其 init() 方法进行初始化操作,Filter 对象只会创建一次, init() 方法也只会执行一次。通过 init() 方法的参数可获得当前 Filter 配置信息的 FilterConfig 对象。

public void init(FilterConfig filterConfig) throws ServletException {
    this.config = filterConfig;
    System.out.println("MyFilter init......");
}

2、doFilter(ServletRequest request, ServletResponse Response, FilterChain chain)
Filter 过滤器的核心,当配置好拦截的 web 资源时,每次调用 web 资源的 service 方法之前都会调用该方法进行拦截。

public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {

    //到达目标资源前的代码
    System.out.println("请求之前。。。。。。");

    //将请求转发给下一个过滤器或目标资源
    filterChain.doFilter(request,response);

    //目标资源响应后的代码
    System.out.println("请求之后。。。。。。");
}

3、destroy()
Web 容器调用该方法销毁该过滤器,在 Filter 的整个生命周期中该方法只被执行一次,在该方法中可以释放该 Filter 中占用的资源。

public void destroy() {
    System.out.println("MyFilter destroy......");
}

4、在 Web 应用程序启动时,Web 服务器将根据 web.xml 文件中的配置信息来创建每个注册的 Filter 实例对象,并将其保存在服务器的内存中。

5、过滤器的执行流程图:

java filter 返回消息 java中的filter怎么用_java_02

Web 服务器根据 Filter 在 web.xml 文件中的配置顺序来执行,首先先执行 Filter1 的 doFilter方法,在执行到 chain.doFilter(resq, resp) 后会将控制权交给下一个 Filter 或者请求资源,这样逐级过滤深入到达请求资源后又会将控制权反向逐级交还控制权,控制权的大致流程为: Filter1 –> Filter2 –> 请求资源 –> Fiter2 –> Filter1。

Filter 的生命周期

① 和 Servlet 程序一样, Filter 的创建和销毁由 Web 服务器负责。Web 应用程序启动时, Web 服务器将创建 Filter 的实例对象,并调用其 init() 方法进行初始化操作。
② 创建好的 Filter 对象被 Web 容器保存进应用级的集合容器中等待着用户访问资源。
③ 当用户访问的资源正好被配置的 Filter 的 url-pattern 拦截时,Web 容器会取出 Filter 对象调用其 doFilter 方法,此后 Filter 对象将常驻留在 Web 容器中。
④ 当应用服务被停止或者重新装载时,就会执行 Filter 的 destroy 方法, Filter 对象被销毁。

Filter 的工作原理

当客户端发出Web资源的请求时,Web服务器根据应用程序配置文件设置的过滤规则进行检查,若客户请求满足过滤规则,则对客户请求/响应进行拦截,对请求头和请求数据进行检查或改动,并依次通过过滤器链,最后把请求/响应交给请求的Web资源处理。
请求信息在过滤器链中可以被修改,也可以根据条件让请求不发往资源处理器,并直接向客户机发回一个响应。当资源处理器完成了对资源的处理后,响应信息将逐级逆向返回。同样在这个过程中,用户可以修改响应信息,从而完成一定的任务。