[color=#345286] web.xml 中声明的每个 filter 在每个虚拟机中仅仅只有一个实例。[/color]
[color=#345286] [b](1) 加载和实例化[/b][/color]
[color=#345286] Web 容器启动时,即会根据 web.xml 中声明的 filter 顺序依次实例化这些 filter。[/color]
[color=#345286] [b](2) 初始化[/b][/color]
[color=#345286] Web 容器调用 init(FilterConfig) 来初始化过滤器。容器在调用该方法时,向过滤器传递 FilterConfig 对象,FilterConfig 的用法和 ServletConfig 类似。利用 FilterConfig 对象可以得到 ServletContext 对象,以及在 web.xml 中配置的过滤器的初始化参数。在这个方法中,可以抛出 ServletException 异常,通知容器该过滤器不能正常工作。此时的 Web 容器启动失败,整个应用程序不能够被访问。[/color][color=#FF0000][b]实例化和初始化的操作只会在容器启动时执行,而且只会执行一次。[/b][/color]
[color=#345286] [b](3) doFilter[/b][/color]
[color=#345286] doFilter 方法类似于 Servlet 接口的 service 方法。当客户端请求目标资源的时候,容器会筛选出符合 filter-mapping 中的 url-pattern 的 filter,并按照声明 filter-mapping 的顺序依次调用这些 filter 的 doFilter 方法。在这个链式调用过程中,可以调用 chain.doFilter(ServletRequest, ServletResponse) 将请求传给下一个过滤器(或目标资源),也可以直接向客户端返回响应信息,或者利用 RequestDispatcher 的 forward 和 include 方法,以及 HttpServletResponse 的 sendRedirect 方法将请求转向到其它资源。需要注意的是,这个方法的请求和响应参数的类型是 ServletRequest 和 ServletResponse,也就是说,过滤器的使用并不依赖于具体的协议。[/color]
[color=#345286] [b](4) 销毁[/b][/color]
[color=#345286] Web 容器调用 destroy 方法指示过滤器的生命周期结束。在这个方法中,可以释放过滤器使用的资源。[/color]
[color=#345286] 与开发 Servlet 不同的是,Filter 接口并没有相应的实现类可供继承,要开发过滤器,只能直接实现 Filer 接口。[/color]
[color=#345286] [b](1) 加载和实例化[/b][/color]
[color=#345286] Web 容器启动时,即会根据 web.xml 中声明的 filter 顺序依次实例化这些 filter。[/color]
[color=#345286] [b](2) 初始化[/b][/color]
[color=#345286] Web 容器调用 init(FilterConfig) 来初始化过滤器。容器在调用该方法时,向过滤器传递 FilterConfig 对象,FilterConfig 的用法和 ServletConfig 类似。利用 FilterConfig 对象可以得到 ServletContext 对象,以及在 web.xml 中配置的过滤器的初始化参数。在这个方法中,可以抛出 ServletException 异常,通知容器该过滤器不能正常工作。此时的 Web 容器启动失败,整个应用程序不能够被访问。[/color][color=#FF0000][b]实例化和初始化的操作只会在容器启动时执行,而且只会执行一次。[/b][/color]
[color=#345286] [b](3) doFilter[/b][/color]
[color=#345286] doFilter 方法类似于 Servlet 接口的 service 方法。当客户端请求目标资源的时候,容器会筛选出符合 filter-mapping 中的 url-pattern 的 filter,并按照声明 filter-mapping 的顺序依次调用这些 filter 的 doFilter 方法。在这个链式调用过程中,可以调用 chain.doFilter(ServletRequest, ServletResponse) 将请求传给下一个过滤器(或目标资源),也可以直接向客户端返回响应信息,或者利用 RequestDispatcher 的 forward 和 include 方法,以及 HttpServletResponse 的 sendRedirect 方法将请求转向到其它资源。需要注意的是,这个方法的请求和响应参数的类型是 ServletRequest 和 ServletResponse,也就是说,过滤器的使用并不依赖于具体的协议。[/color]
[color=#345286] [b](4) 销毁[/b][/color]
[color=#345286] Web 容器调用 destroy 方法指示过滤器的生命周期结束。在这个方法中,可以释放过滤器使用的资源。[/color]
[color=#345286] 与开发 Servlet 不同的是,Filter 接口并没有相应的实现类可供继承,要开发过滤器,只能直接实现 Filer 接口。[/color]