首页 > 代码库 > Filter--过滤器学习笔记
Filter--过滤器学习笔记
一.简介
Filter 的基本功能是对 Servlet 容器调用 Servlet 的过程进行拦截,即对servlet的请求和响应进行拦截;
在 Servlet API 中定义了三个接口类来开供开发人员编写Filter 程序:Filter, FilterChain, FilterConfig;
Filter 程序是一个实现了 Filter 接口的 Java 类,由 Servlet 容器进行调用和执行;
Filter 程序需要在 web.xml 文件中进行注册和设置它所能拦截的资源;
若有多个 Filter 程序对某个 Servlet 程序的访问过程进行拦截,当针对该 Servlet 的访问请求到达时,web 容器将把这多个
Filter 程序组合成一个 Filter 链(过滤器链)。Filter 链中各个 Filter 的拦截顺序与它们在应用程序的 web.xml 中映射的顺序一致。
二.Filter相关API
1.Filter接口
Filter生命周期与Servlet很类似
①在 web 应用程序启动时,web 服务器将根据 web.xml 文件中的配置信息来创建每个注册的 Filter 实例对象,并将其保存在服务器的内存中
②装载并创建Filter的一个实例对象:调用Filter实例对象的init(FilterConfig filterConfig)方法,该方法在 Filter 生命周期中仅执行一次
③当客户端请求目标资源的时候,容器就会调用与这个目标资源相关联的过滤器的doFilter(ServletRequest request,ServletResponse response,
FilterChain chain)方法;在特定的操作完成后,可以调用chain.doFilter(request,response)方法,把请求交给下个Filter或Servlet处理,或直接
将请求转发或重定向
④WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Filter,并在卸载之前调用Filter的destroy()方法,该方法在Filter的生命周期中仅执行一次
2.FilterConfig 接口
类似于ServletConfig接口,由容器实现
ServletConfig对象中封装了ServletContext 对象和 Filter 的配置参数信息,并将其作为参数传入Filter对象的init()方法中
3.FilterChain接口
代表当前 Filter 链的对象,由容器实现,并将其实例作为参数传入过滤器对象的doFilter()方法中
在doFilter()方法,通过chain.doFilter(request,response),使过滤器链中的下一个过滤器被调用。若为最后一个过滤器,则调用目标资源
三.Filter的注册与设置
定义完Filter类后,需要在web.xml中注册和映射Filter如下:
<!-- Filter注册 --> <filter> <filter-name>testFilter</filter-name> <filter-class>com.milan.filter.TestFilter</filter-class> </filter> <!-- Filter映射 --> <filter-mapping> <filter-name>testFilter</filter-name> <url-pattern>/index.jsp</url-pattern> </filter-mapping
1.Filter注册
在注册Filter时,可以用<init-param>标签为过滤器指定初始化参数,在过滤器中,可以使用FilterConfig接口对象来访问初始化参数
2.Filter映射
Filter映射:用<filter-mapping>设置一个 Filter 所负责拦截的资源,其拦截的资源有两种:资源访问的请求路径(<url-pattern>)和
Servlet 名称(<servlet-name>)
<filter-mapping>还有一个<dispatcher>标签,用于指定过滤器所拦截的资源被 Servlet 容器调用的方式,可以是REQUEST(默认),
INCLUDE,FORWARD和ERROR之一,并且可以设置多个<dispatcher> 子元素用来指定 Filter 对资源的多种调用方式进行拦截,如下:
<!-- Filter映射 --> <filter-mapping> <filter-name>testFilter</filter-name> <url-pattern>/index.jsp</url-pattern> <dispatcher>REQUEST</dispatcher><!-- 表示当用户直接访问index.jsp时拦截 --> <dispatcher>FORWARD</dispatcher><!-- 表示当用户请求被转发index.jsp时拦截 --> </filter-mapping>
设置了<dispatcher> ,表示拦截器只拦截以指定方式访问资源的请求与响应
REQUEST:用户直接访问页面
INCLUDE:目标资源是通过RequestDispatcher的include()方法访问
FORWARD:目标资源是通过RequestDispatcher的forward()方法访问
ERROR:目标资源是通过声明式异常处理机制调用时
在同一个 web.xml 文件中可以为同一个 Filter 设置多个映射
Filter--过滤器学习笔记