Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件
等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。过滤器根据请求的URL分析确定要拦截什么样的请求。所谓的拦截就是在真正请求资源之前将代表请求的request对象和代表响应的response对象截获从而实现:
1.在资源执行之前做一些额外的操作
2.在资源之后做一些额外的操作
3.控制是否允许访问的资源
一、Filter开发分为二个步骤
1.编写java类实现Filter接口,并实现(三个方法)其doFilter方法
2.在 web.xml 文件中使用<filter>和<filter-mapping>元素对编写的filter类进行注册,并设置它所能拦截的资源
package com.jjyy.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/**
* filter测试
* @author JiangYu
*
*/
public class TestFilter implements Filter {
public void destroy() {
System.out.println();
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("执行之前操作。。。。");
chain.doFilter(request, response);
System.out.println("执行之后操作。。。。");
}
public void init(FilterConfig config) throws ServletException {
System.out.println();
}
}
web,xml中
注册Filter
<span style="white-space:pre"> </span><filter>
<filter-name>FilterTest01</filter-name>
<filter-class>com.jjyy.filter.TestFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterTest01</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
二、Filter链
1.在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称之为一个Filter链
2.web服务器根据Filter在web.xml文件中的注册顺序<mapping>,决定先调用哪个Filter,当第一个Filter的doFilter方法被调用时,web服务器会创建一个代表Filter链的
FilterChain对象传递给该方法。在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain对象中是否还有filter,如果有,则
调用第2个filter,如果没有,则调用目标资源。
三、Filter的生命周期
1.init(FilterConfig filterConfig)throws ServletException
和我们编写的Servlet程序一样,Filter的创建和销毁由WEB服务器负责。 web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法进行初始化(注
filter对象只会创建一次,init方法也只会执行一次)开发人员通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象
注意:FilterConfig接口
FilterConfig接口代表web.xml中对当前过滤器的配置信息
2.doFilter(ServletRequest,ServletResponse,FilterChain)
每次filter进行拦截都会执行
在实际开发中方法中参数request和response通常转换为HttpServletRequest和HttpServletResponse类型进行操作
所有对当前资源访问进行拦截的过滤器按照拦截顺序就组成了一个过滤器链.这个过滤器链的最后一个节点是要访问的资源
Filter中调用FilterChain提供了doFilter方法,这个方法一旦被调用就表明当前过滤器没有问题了,请执行过滤器链的下一个节点.如果下一个节点是资源则直接执行了资源
3.destroy()
在Web容器卸载 Filter 对象之前被调用
四、filter注册web.xml
<span style="white-space:pre"> </span><filter>
<filter-name>Demo1Filter</filter-name> <!-- 给过滤器起一个名字 -->
<filter-class>com.itheima.filter.Demo1Filter</filter-class> <!--过滤器的处理类 -->
<init-param>
<!--可以配置当前过滤器的初始化信息,可以配置多个,在Filter中利用FilterConfig对象来获取 -->
<param-name>name1</param-name>
<param-value>value1</param-value>
</init-param>
</filter>
<filter-mapping>
<!-- 一个Filter可以配置多个filter-mapping -->
<filter-name>Demo1Filter</filter-name>
<url-pattern>/servlet/Demo1Servlet</url-pattern>
<!-- 一个Filtermapping中可以配置多个url-partten,这个url-partten的写法和servlet-mapping中的写法相同-->
<url-pattern>/servlet/*</url-pattern>
<url-pattern>/*</url-pattern>
<url-pattern>*.do</url-pattern>
<servlet-name>Demo3Servlet</servlet-name>
<!-- 也可以配置多个servlet-name,其中填入servlet的名字明确的通知要拦截哪个名字的Servlet -->
<dispatcher>REQUEST</dispatcher>
<!-- 配置拦截哪种方式的对资源的访问可以是REQUEST/FORWARD/INCLUDE/ERROR四个值之中的一个,可以配置多个dispatcher,如果一个都不配则默认是REQUEST -->
<dispatcher>FORWARD</dispatcher>
</filter-mapping>