1、request过滤器
这种过滤器的工作方式比较简单,大家也经常遇到,如下图所示:以下是web.xml文件配置方式:
<filter >
<filter-name >myFilter</filter-name >
<filter-class >xx.MyFilter</filter-class >
<filter >
<filter-mapping >
<filter-name >myFilter</filter-name >
<servlet-name >目标资源一</servlet-name >
</filter-mapping >
下面我们更改一下web.xml文件的配置,如下方式:
<filter >
<filter-name >myFilter</filter-name >
<filter-class >xx.MyFilter</filter-class >
</filter >
<filter-mapping >
<filter-name >myFilter</filter-name >
<servlet-name >目标资源一</servlet-name >
</filter-mapping >
<filter-mapping >
<filter-name >myFilter</filter-name >
<servlet-name >目标资源二</servlet-name >
</filter-mapping >
也就是说此过滤器对目标资源一和目标资源二都进行过滤,然后当目标资源一被访问的时候我们将请求转发给目标资源二,那么这个时候过滤器是怎么工作的呢?如下图所示:我们可以看到,当我们访问目标资源一时过滤器截取了请求,然后再转发给目标资源一,然后再转发给目标资源二,从图中我们可以看到过滤器没有截取转发到目标资源二的请求,但是我们已经在web.xml文件中配置了该过滤器对目标资源二的过滤,为什么又没有起到过滤作用呢?
答案就在于,目标资源一是客户端直接访问,而目标资源二是被转发过来的,这时过滤器就不能过滤目标资源二。如果你直接访问目标资源二,你会发现该过滤器起到了作用?
我们上面的web.xml文件配置与以下方式等价:
<filter >myFilter</filter >
<filter-name >myFilter</filter-name >
<filter-class >xx.MyFilter</filte-class >
</filter >
<filter-mapping >
<filter-name >myFilter</filter-name >
<servlet-name >目标资源一</servlet-name >
<dispatcher >REQUEST</dispatcher >
</filter-mapping >
<filter-mapping >
<filter-name >myFilter</filter-name >
<servlet-name >目标资源二</servlet-name >
<dispatcher >REQUEST</dispatcher >
</filter-mapping >
这种方式的配置,说明只有直接访问该目标资源时该过滤器才会起作用,对转发到该目标资源的请求将忽略不处理。
那如果我想对转发到目标资源二的请求进行过滤,那怎么办呢?答案见,下一种过滤器,forward过滤器。