您的位置:首页 > 其它

传智播客学习之Servlet过滤器

2010-01-09 23:59 387 查看


近日,学习异常紧张,冯老师为了让我们提前感受项目的紧张气氛,同时为了提高我们的项目感觉,代码质量和速度,每天给我们布置了不少的任务,并在我们的要求下不断从项目中抽出部分模块让我们利用业余时间来完成,所以最近睡眠质量明显下降,有时为了搞清一段程序的原理,不断地去翻阅底层源代码,分析底层的过程是痛苦的,但是每当通过底层代码弄清原理的时候总是有一种说不出的幸福感,但是有时候也会将自己绕进去出不来,导致凌晨两三点大脑一直处于极度兴奋,最后的结果发现听课质量有些下降,为了更好的吸收老是上课的精华,给自己想了一个方式,那就是记笔记,我发现这是一个不错的学习方法,不仅在听课质量方面有了明显的提高,也为自己课下复习提供了一个非常好的大纲,基本不会落下任何一个知识点,同时可以随手记下自己没能理解的地方,需要查阅资料的地方,这样一天下来,感觉收获颇丰啊!今天就和大家分享一下我的Serlet过滤器的学习笔记吧。
一、 什么是web应用开发中过滤器以及他的功能
定义:过滤器其实是一个程序,它先于与之相关的servlet或JSP页面运行在服务器上。过滤器可附加到一个或多个servlet或JSP页面上,并且可以检查进入这些资源的请求信息
功能:是对 Servlet 容器调用 Servlet 的过程进行拦截,从而在 Servlet 进行响应处理的前后实现一些特殊的功能
二、 工作原理
当客户端发送请求,首先经过过滤器(过滤不合法动作以及不合法文字并进行处理),在Servlet作为过滤器使用时,它可以对客户的请求进行处理。处理完成后,它会交给下一个过滤器处理,这样,客户的请求在过滤链里逐个处理,直到请求发送到目标为止。处理后可采取如下如下动作
①以常规的方式调用资源(即,调用servlet或JSP页面)。
  ②利用修改过的请求信息调用资源。
  ③调用资源,但在发送响应到客户机前对其进行修改。
④阻止该资源调用,代之以转到其他的资源,返回一个特定的状态代码或生成替换输出。
原理图如下:

注意:在一个 web 应用程序中可以注册多个 Filter 程序,每个 Filter 程序都可以对一个或一组 Servlet 程序进行拦截。若有多个 Filter 程序对某个 Servlet 程序的访问过程进行拦截,当针对该 Servlet 的访问请求到达时,web 容器将把这多个 Filter 程序组合成一个 Filter 链(过滤器链)。Filter 链中各个 Filter 的拦截顺序与它们在应用程序的 web.xml 中映射的顺序一致

三、 如何在Web程序中实现过滤器
1.实现步骤:
在 Servlet API 中定义了三个接口类来开供开发人员编写 Filter 程序:Filter, FilterChain, FilterConfig。实现过滤器的步骤如下:
1). 编写一个Filter程序,实现Filter接口,并根据需要实现接口中过滤器生命周期的方法
2).在web.xml中注册和映射过滤器
2.Filter的生命周期()
1)init(FilterConfig filterConfig):这是Servlet过滤器的初始化方法.
l 在 web 应用程序启动时,web 服务器将根据 web.xml 文件中的配置信息来创建每个注册的 Filter 实例对象,并将其保存在服务器的内存中。Web容器(servlet容器)创建 Filter 对象实例后,将立即调用该 Filter 对象的 init 方法。
l Init 方法在 Filter 生命周期中仅执行一次, servlet容器在调用 init 方法时,会传递一个包含 Filter 的配置和运行环境的 FilterConfig 对象(FilterConfig的用法和ServletConfig类似)。利用FilterConfig对象可以得到ServletContext对象,以及部署描述符中配置的过滤器的初始化参数。
l 在这个方法中,可以抛出ServletException异常,通知容器该过滤器不能正常工作。
2) destroy(): Servlet容器在卸载过滤器实例前调用该方法。该方法在Filter的生命周期中仅执行一次。在这个方法中,可以释放过滤器使用的资源.
3) doFilter(ServletRequest request,ServletResponse response, FilterChain chain)类似于Servlet接口的service()方法。当客户端请求目标资源的时候,容器就会调用与这个目标资源相关联的过滤器的doFilter()方法。
l 其中参数 request, response 为 web 容器或 Filter 链的上一个 Filter 传递过来的请求和相应对象;
l 参数 chain 为代表当前 Filter 链的对象,在特定的操作完成后,可以在当前 Filter 对象的 doFilter 方法内部需要调用 FilterChain 对象的 chain.doFilter(request,response)方法才能把请求交付给 Filter 链中的下一个 Filter 或者目标 Servlet 程序去处理,也可以直接向客户端返回响应信息,或者利用RequestDispatcher的forward()和include()方法,以及HttpServletResponse的sendRedirect()方法将请求转向到其他资源
3.过滤器对请求的过滤
1) Servlet容器创建一个过滤器实例
2) Servlet容器调用init方法,读取过滤器的初始化参数
3) Servlet容器调用doFilter方法,根据初始化参数的值,判断该请求是否合法
4) 如果该请求不合法则阻塞该请求
5) 如果该请求合法则调用chain.doFilter方法将该请求向后续传递
4.过滤器对响应的过滤
1)过滤器截获客户端的请求.
2)重新封装ServletResponse,在封装后的ServletResponse中提供用户自定义的输出流.将请求向后续传递.
3)Web组件产生响应.
4)从封装后的ServletResponse中获取用户自定义的输出流.
5)将响应内容通过用户自定义的输出流写入到缓冲流中.在缓冲流中修改响应的内容后清空缓冲流,输出响应内容.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: