JSP学习总结-使用Servlet过滤器
一、过滤器是什么?
对web应用来说,过滤器就是驻留在服务器端、源数据和目的数据之间,对web请求和web响应的头属性(Header)和内容体(Body)进行操作的一种特殊的web组件。它们拦截请求和响应。
二、过滤器怎么工作的?
当web容器收到一个对资源的请求时,容器将判断是否有过滤器与这个资源有关,如果有,容器把这个请求发给过滤器进行处理,过滤器处理请求后再把请求发送给目标资源。当目标资源对请求作出响应时,响应也会被容器先转发给过滤器,在过滤器中对响应内容进行处理,然后响应被发送到客户端。
在一个web应用程序中,可以部署多个过滤器,这些过滤器组成一个过滤器链。过滤器链中的每个过滤器都有特定的操作,请求和响应在浏览器和目标资源之间按照部署描述符中声明的过滤器顺序,在过滤器之间进行传递。
在请求资源时按照过滤器的顺序依次对请求进行处理,并将请求沿过滤器链传递给下一个过滤器,直到传递到目标资源;发送响应则是按照过滤器链相反方向对响应进行处理和传递,直到把响应传到客户端为止。过滤器并不是必须把请求传送到下一个过滤器,它也可以根据处理结果直接给客户端发送响应,也可以将请求转发给另一个目标资源。
三、Filter API
与过滤器开发相关的一些接口和类
1、Filter接口
所有的过滤器在开发中都只能实现java.servlet.Filter接口。并且提供一个公开的不带参数的构造方法。接口定义了init()、doFiter()、destroy()3个方法,和servlet接口相似。
(1)public void init(FilterConfig config)throws ServletException
web容器调用init()方法,说明过滤器正在被嵌入到web容器中去。容器只在实例化过滤器时才会调用该方法一次。初始化方法必须在被调用做过滤工作前正确完成。容器为这个方法传递一个FilterConfig对象,其中包含着在部署描述符中配置的与过滤器相关的初始化参数。
(2)public void doFiter(ServletRequest req,ServletResponse res,FilterChain chain)throws IOException,ServletException
实现了过滤器对请求和响应的操作功能。每当请求和响应经过过滤器链时,容器都要调用一次该方法。FilterChain对象代表了多个过滤器形成的过滤器链。为了将请求/响应沿过滤器链继续传送,在每个过滤器的doFilter()方法中必须调用FilterChain对象的doFilter()方法。
web容器将请求对象,响应对象和过滤器的链接对象3个参数传递到该方法。在过滤器中处理的ServletRequest对象和ServletResponse对象,最终要传递到被过滤的Servlet和JSP,所以在doFilter()方法中可以通过对ServletRequest的操作在Servlet运行之前改变web请求的头信息或内容,通过对ServletResponse的操作在Servlet运行之后改变响应结果。
(3)public void destroy()
web容器调用destroy()方法表示过滤器生命周期结束,在这个方法中释放过滤器使用的资源。
2、FilterConfig接口
当容器对Filter对象进行初始化时,容器调用Filter的init(),并传入一个实现FilterConfig接口的对象。Filter可以使用该对象获得部署文件中的一些配置信息。
3、FilterChain接口
这个接口由容器实现,容器将其实例作为参数传入过滤器对象的doFilter()方法中。过滤器对象使用FilterChain对象调用过滤器链中的下一个过滤器或者调用目标资源。
FilterChain接口仅定义一个方法:public void doFilter(),该方法用于将请求/响应继续沿过滤器链向后传送给下一个过滤器。如果调用该方法的过滤器是链中最后一个,则调用目标资源。
四、开发部署一个过滤器
1、编写一个过滤器类
实现Filter接口,然后在doFilter()中写需要执行的代码。
2、部署过滤器
①声明过滤器<filter>
<filter>元素的结构如下:
②设置过滤器映射<filter-mapping>
<filter-mapping>元素结构如下:
配置如下: