Java过滤器filter

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Java过滤器filter

Filter过滤器技术。通过过滤器,可以对来自客户端的请求进行拦截,进行预处理或者对最终响应给客户端的数据进行处理后再输出。

要想使用Filter过滤器,非常简单,只要实现Servlet API中的Filter接口即可,同时在该web应用【WEB-INF】目录下的web.xml文件中配置两个标签。其中可以根据配置指定过滤的页面或者Servlet。

也就是说我们在web工程中光光写Filter过滤器的Java代码是不会起作用的,要在web.xml文件中对过滤器进行注册和映射,在学习Filter之前我们先来学习如何注册和映射

关于注册:

需要在web.xml文件中配置标签,这还不够,标签下的是必须要填的内容。

标签中有如下子元素:

用于描述该标签,非必须;

为过滤器指定一个名称,必须的

指定该过滤器使用的web工程中的哪一个filter类,包含包名与类名,必须的;

为过滤器的初始化提供参数,非必须,后面有例子。

关于映射:

需要在web.xml文件中配置标签,这还不够,标签下的以及

之一是必须的。

标签中有如下子元素:

设置要映射过滤器的名称,该名称必须同标签下的的值一致。

设置过滤器要拦截过滤的请求路径,例如“/*”则表示对该web应用下所有的请求都进行拦截过滤。

如果只要拦截过滤访问某个Servlet,就可以使用该标签来替代

设置拦截过滤客户端请求的方式,有REQUEST,INCLUDE,FORWARD,ERROR四种(请注意均为大写)。非必须则默认为REQUEST,使用多个标签来设置多种请求方式。

关于的四种方式,这里再简单的介绍一下:

REQUEST:当用户直接访问我们的资源时,这时我们设置的过滤器就会进行拦截。但如果以转发和包含方式访问资源,那么该过滤器则不会被调用。

INCLUDE:当使用RequestDispatch的include方法请求时,该过滤器会被调用。

FORWARD:当使用RequestDispatch的forward方法时请求资源时,该过滤器会被调用,尤其是在MVC设计模式下,JSP都被保护起来,必须要通过Servlet进行转发才能访问JSP,那么该过滤器就是在Servlet转发到JSP这个过程中被执行。

ERROR:当请求是通过错误异常进行跳转时就会调用该过滤器。

一个简单的对过滤器的注册和映射的示例:

1 2 3 4

FilterDemo1

com.bjpowernode.web.filter.FilterDemo1

服务器关闭就会执行destory方法。

而我们通常要使用过滤器处理请求,则重点在于doFilter(…)方法。当请求要经过一个过滤器的时候,就会由服务器调用doFilter方法。

我们先来看看一个带有过滤器Filter的web应用的请求和响应流程:

记住:从请求到响应这个流程会经过Filter对象两次!

在doFilter这一个方法中就可以对着两次经过的过程进行处理,那么这里就有一个问题了,如果能通过过滤器,那么就到过滤器后面了,貌似应该是执行完doFilter方法了,而服务器的响应又经过过滤器,难道又要执行doFilter方法一次?但是这个方法里面的代码不是也有处理最开始请求的吗?

这就跟doFilter方法中的第三个参数FilterChain有关了,FilterChain对象是过滤器链,这个我们稍后会介绍。在FilterChain对象中只有一个方法:

也是叫doFilter方法(千万别和Filter接口的doFilter方法弄混了)。简单的说下这个方法,只要调用了这个方法,就会将请求交给后面一个Filter进行过滤(一个Web应用中可以有多个Filter),如果该Filter是最后一个,那么调用该方法则将执行请求,也就是到我们的应用中获取资源。

因此从请求到响应这个流程经过Filter的两次处理分别是在FilterChain.doFilter方法的前面和后面!如下图所示:

那么下面我们就先以一个简单的例子来熟悉下Filter吧:

例1:

创建web工程FilterLearning,创建一个FilterDemo1类,同时这个类要实现javax.servlet.Filter接口。如下代码:

1public class FilterDemo1 implements Filter {

2

3@Override

4public void doFilter(ServletRequest request, ServletResponse response,

5FilterChain chain) throws IOException, ServletException {

6

7System.out.println("hello filter");

8}

9

10//此处省略init方法和destory方法

11 }

写好Filter的Java代码还没完,还要在web应用下的web.xml文件中配置如下信息:

1

2FilterDemo1

3com.bjpowernode.web.filter.FilterDemo1

4

5

6

7FilterDemo1

8/*

相关文档
最新文档