Filter过滤器

Filter生命周期

和Servlet一样,Filter的创建和销毁也是由WEB服务器负责。

Filter与Servlet的区别

1、在应用启动的时候就进行装载Filter类而servlet是在请求时才创建(但filter与Servlet的load-on-startup配置效果相同)。

2、容器创建好Filter对象实例后,调用init()方法。接着被Web容器保存进应用级的集合容器中去了等待着,用户访问资源。

3、当用户访问的资源正好被Filter的url-pattern拦截时,容器会取出Filter类调用doFilter方法,下次或多次访问被拦截的资源时,Web容器会直接取出指定Filter对象实例调用doFilter方法(Filter对象常驻留Web容器了)。

4、当应用服务被停止或重新装载了,则会执行Filter的destroy方法,Filter对象销毁。

Filter工作原理(执行流程)

当客户端发出Web资源的请求时,Web服务器根据应用程序配置文件设置的过滤规则进行检查,若客户请求满足过滤规则,则对客户请求/响应进行拦截,对请求头和请求数据进行检查或改动,并依次通过过滤器链,最后把请求/响应交给请求的Web资源处理。

请求信息在过滤器链中可以被修改,也可以根据条件让请求不发往资源处理器,并直接向客户机发回一个响应。当资源处理器完成了对资源的处理后,响应信息将逐级逆向返回。同样在这个过程中,用户可以修改响应信息,从而完成一定的任务。

过滤链的好处是,执行过程中任何时候都可以打断,只要不执行chain.doFilter()就不会再执行后面的过滤器和请求的内容。

针对多个过滤器来说,例如,EncodingFilter负责设置编码,SecurityFilter负责控制权限,服务器会按照web.xml中过滤器定义的先后循序组装成一条链,然后一次执行其中的doFilter()方法,在实际使用时,就要特别注意过滤链的执行顺序问题,像EncodingFilter就一定要放在所有Filter之前,这样才能确保在使用请求中的数据前设置正确的编码。

Filter的API详解

1、ilter生命周期及其与生命周期相关的方法

Filter接口有三个方法,并且这个三个都是与Filter的生命相关的方法

init(Filterconfig):代表filter对象初始化方法 filter对象创建时执行

doFilter(ServletRequest,ServletResponse,FilterChain):代表filter执行过滤的核心方法,如果某资源在已经被配置到这个filter进行过滤的话,那么每次访问这个资源都会执行doFilter方法

destory():代表是filter销毁方法 当filter对象销毁时执行该方法

Filter对象的生命周期:

Filter何时创建:服务器启动时就创建该filter对象

Filter何时销毁:服务器关闭时filter销毁

2、Filter的AP详解

● init(FilterConfig)

其中参数config代表 该Filter对象的配置信息的对象,内部封装是该filter的配置信息。

@Override

//初始化方法:Filter创建时去执行init方法

public void init(FilterConfig filterConfig) throws ServletException {

//1、获得web.xml中filter 的名称 QuickFilter1

System.out.println(filterConfig.getFilterName());

//2、还能获得当前filter的一些初始化参数

System.out.println(filterConfig.getInitParameter("aaa"));

//3、获得servletContext

filterConfig.getServletContext();

System.out.println("init....");

}

● destory()方法

filter对象销毁时执行

● doFilter方法

doFilter(ServletRequest,ServletResponse,FilterChain)

其中的参数:

ServletRequest/ServletResponse:每次在执行doFilter方法时 web容器负责创建一个request和一个response对象作为doFilter的参数传递进来。该request个该response就是在访问目标资源的service方法时的request和response。

FilterChain:过滤器链对象,通过该对象的doFilter方法可以放行该请求

3、Filter的配置

  <filter>
       <filter-nameFilter1</filter-name>
       <filter-class>com.filter.Filter1</filter-class>
</filter>
<filter-mapping>
       <filter-name>Filter1</filter-name>
       <url-pattern>/*</url-pattern>
</filter-mapping>

4、url-pattern配置时

● 完全匹配 /sertvle1

● 目录匹配 /aaa/bbb/* ----最多的

/user/*:访问前台的资源进入此过滤器

/admin/*:访问后台的资源时执行此过滤器

● 扩展名匹配 *.abc *.jsp

注意:url-pattern可以使用servlet-name替代,也可以混用

5、dispatcher:访问的方式(了解)

配置格式为:*

REQUEST:默认值,代表直接访问某个资源时执行filter

FORWARD:转发时才执行filter

INCLUDE: 包含资源时执行filter

ERROR:发生错误时 进行跳转是执行filter

6、Filter的作用?

● 公共代码的提取

● 可以对request和response中的方法进行增强(装饰者模式/动态代理)

● 进行权限控制