您的位置:首页 > 其它

初识Servlet过滤器

2010-08-16 11:45 190 查看






一、 什么是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过滤器的初始化方法.

在 web 应用程序启动时,web 服务器将根据 web.xml 文件中的配置信息来创建每个注册的 Filter 实例对象,并将其保存在服务器的内存中。Web容器(servlet容器)创建 Filter 对象实例后,将立即调用该 Filter 对象的 init 方法。

Init 方法在 Filter 生命周期中仅执行一次, servlet容器在调用 init 方法时,会传递一个包含 Filter 的配置和运行环境的 FilterConfig 对象(FilterConfig的用法和ServletConfig类似)。利用FilterConfig对象可以得到ServletContext对象,以及部署描述符中配置的过滤器的初始化参数。

在这个方法中,可以抛出ServletException异常,通知容器该过滤器不能正常工作。

2) destroy(): Servlet容器在卸载过滤器实例前调用该方法。该方法在Filter的生命周期中仅执行一次。在这个方法中,可以释放过滤器使用的资源.

3) doFilter(ServletRequest request,ServletResponse response, FilterChain chain)类似于Servlet接口的service()方法。当客户端请求目标资源的时候,容器就会调用与这个目标资源相关联的过滤器的doFilter()方法。

其中参数 request, response 为 web 容器或 Filter 链的上一个 Filter 传递过来的请求和相应对象;

参数 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)将响应内容通过用户自定义的输出流写入到缓冲流中.在缓冲流中修改响应的内容后清空缓冲流,输出响应内容.



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: