Java过滤器filter
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Java过滤器filter
Filter过滤器技术。通过过滤器,可以对来自客户端的请求进行拦截,进行预处理或者对最终响应给客户端的数据进行处理后再输出。
要想使用Filter过滤器,非常简单,只要实现Servlet API中的Filter接口即可,同时在该web应用【WEB-INF】目录下的web.xml文件中配置
也就是说我们在web工程中光光写Filter过滤器的Java代码是不会起作用的,要在web.xml文件中对过滤器进行注册和映射,在学习Filter之前我们先来学习如何注册和映射
关于注册:
需要在web.xml文件中配置
关于映射:
需要在web.xml文件中配置
关于
REQUEST:当用户直接访问我们的资源时,这时我们设置的过滤器就会进行拦截。但如果以转发和包含方式访问资源,那么该过滤器则不会被调用。
INCLUDE:当使用RequestDispatch的include方法请求时,该过滤器会被调用。
FORWARD:当使用RequestDispatch的forward方法时请求资源时,该过滤器会被调用,尤其是在MVC设计模式下,JSP都被保护起来,必须要通过Servlet进行转发才能访问JSP,那么该过滤器就是在Servlet转发到JSP这个过程中被执行。
ERROR:当请求是通过错误异常进行跳转时就会调用该过滤器。
一个简单的对过滤器的注册和映射的示例:
1 2 3 4
服务器关闭就会执行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
2
3
4
5
6
7
8