标签:
Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截,如下所示:
web服务器在调用doFilter方法时,会传递一个filterChain对象进来,filterChain对象是filter接口中最重要的一个对象,它也提供了一个doFilter方法,开发人员可以根据需求决定是否调用此方法,调用该方法,则web服务器就会调用web资源的service方法,即web资源就会被访问,否则web资源不会被访问。
1.开发Filter
想要开发一个过滤器需要如下两个步骤:
(1)写一个类实现特定的接口Filter
生命周期:当服务器启动时,web应用加载后,立即创建这个web应用中的所有的过滤器,过滤器创建出来后立即调用init方法执行初始化的操作.
创建出来后一直驻留在内存中为后续的拦截进行服务.每次拦截到请求后都会导致doFilter方法执行.
在服务器关闭或web应用被移除出容器时,随着web应用的销毁过滤器对象销毁.销毁之前调用destory方法执行善后工作.
1. init
FilterConfig:代表web.xml中对当前过滤器的配置信息
~获取ServletContext对象
~获取初始化信息
String getFilterName():得到filter的名称
getInitParameter : 返回在部署描述中指定名称的初始化参数的值。如果不存在返回null.
getInitParameterNames 返回过滤器的所有初始化参数的名字的枚举集合。
2. doFilter
request
response
FilterChain:
代表过滤器链的对象.
一个资源可能被多个过滤器所拦截到,拦截的顺序和过滤器在web.xml中filter-mapping的配置顺序相同.
所有对当前资源访问进行拦截的过滤器按照拦截顺序就组成了一个过滤器链.这个过滤器链的最后一个节点是要访问的资源.
Filter中调用FilterChain提供了doFilter方法,这个方法一旦被调用就表明当前过滤器没有问题了,请执行过滤器链的下一个节点.如果下一个节点是资源则直接执行了资源
3. destory
(2)在web.xml中注册一下过滤器
<filter>
<filter-name>Demo1Filter</filter-name> -- 给过滤器起一个名字
<filter-class>com.itheima.filter.Demo1Filter</filter-class> -- 过滤器的处理类
<init-param>--可以配置当前过滤器的初始化信息,可以配置多个,在Filter中利用FilterConfig对象来获取
<param-name>name1</param-name>
<param-value>value1</param-value>
</init-param>
</filter>
<filter-mapping> -- 一个Filter可以配置多个filter-mapping
<filter-name>Demo1Filter</filter-name>
<url-pattern>/servlet/Demo1Servlet</url-pattern>
-- 一个 Filtermapping中可以配置多个url-partten,这个url-partten的写法和servlet-mapping中的写法相同
<url-pattern>/servlet/*</url-pattern>
<url-pattern>/*</url-pattern>
<url-pattern>*.do</url-pattern>
<servlet-name>Demo3Servlet</servlet-name>
--也可以配置多个servlet-name,其中填入servlet的名字明确的通知要拦截哪个名字的Servlet
<dispatcher>REQUEST</dispatcher>
--配置拦截哪种方式的对资源的访问可以是REQUEST/FORWARD/INCLUDE/ERROR四个值之中的一个,可以配置多个dispatcher,如果一个都不配则默认是REQUEST
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
< dispatcher> 子元素可以设置的值及其意义:
REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。
INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。
标签:
原文地址:http://blog.csdn.net/fangchao3652/article/details/51345493