3、 Request Dispatcher变化
Servlet 2.4版的Web程序增强了filter和request dispatcher的配合功能,这样过滤器可以根据请求分发器(request dispatcher)所使用的方法有条件地对Web请求进行过滤。编程者可以通过在web.xml中使用<dispatcher>元素设定过滤器作用的条件(下图1):

图1 设定<dispatcher>元素的过滤器
*只有当request直接来自客户,过滤器才生效,对应<dispatcher>为REQUEST条件。
*只有当request被一个请求分发器使用forward()方法转到一个Web构件时(采用<url-pattern>或<servlet-name>定义),对应<dispatcher>称为FORWARD条件。
*类似地,只有当request被一个请求分发器使用include()方法转到一个Web构件时(采用<url-pattern>或<servlet-name>定义),对应<dispatcher>称为INCLUDE条件。
*只有当request被一个请求分发器使用“错误信息页”机制方法转到一个Web构件时,对应<dispatcher>称为ERROR条件。
*第五种过滤器作用的条件可以是上面四种条件的组合。
下面的程序中的<filter-mapping>定义了当客户请求/icsamples/* 样式的URL时,Security Filter会被用来过滤请求。但是如果到达URL为/icsamples/* 的Web构件的请求是从一个request dispatcher转发过来的,这个过滤器不工作。
<filter-mapping>
<filter-name>Security Filter</filter-name>
<url-pattern>/icsamples/*</url-pattern>
</filter-mapping>
如果使用下面的程序设置,在<filter-mapping>中加入<dispatcher>INCLUDE</dispatcher>,Security Filter只有在被一个request dispatcher使用include()方法包括RequestRecorderServlet时才会工作。在其他情况(如请求直接从客户发来,或request dispatcher使用forward方法)下,Security Filter都不会工作。
<filter-mapping>
<fliter-name>Security Filter</filter-name>
<servlet-name>RequestRecorderServlet</servlet-name>
<dispatcher>INCLUDE</dispatcher>
</filter-mapping>
下面的程序设置定义了Security Filter当request由客户直接发出或request
dispatcher使用forward方法时能工作。
<filter-mapping>
<filter-name>Security Filter</filter-name>
<url-pattern>/icsamples/*</uri-pattern>
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
