Servlet Filter 学习

最近在研究CAS , CAS 中的Servlet Filter 不太熟悉, 所以花了点时间学下了下这部分的知识, 分成以下几部分 学习

1. What is the Servlet Filter ? Servlet Filter  的功能和用法 ?

2. Servlet Filter 顺序的注意事项

Part 1 : What is the Servlet Filter ?

JAVA Doc API as below

http://docs.oracle.com/javaee/6/api/javax/servlet/Filter.html

A filter is an object that performs filtering tasks on either the request to a resource (a servlet or static content), or on the response from a resource, or both.

Filters perform filtering in the doFilter method. Every Filter has access to a FilterConfig object from which it can obtain its initialization parameters, and a reference to the ServletContext which it can use, for example, to load resources needed for filtering tasks.

Filters are configured in the deployment descriptor of a web application.

Examples that have been identified for this design are:

  1. Authentication Filters
  2. Logging and Auditing Filters
  3. Image conversion Filters
  4. Data compression Filters
  5. Encryption Filters
  6. Tokenizing Filters
  7. Filters that trigger resource access events
  8. XSL/T filters
  9. Mime-type chain Filter

Since:

Servlet 2.3

看JAVA Doc 的解释,使用filter可以修改request, response,session, application中的内容。

有所了解以后下面开始在tomcat6 上做了些测试 部分来源于网上的例子

1.javax.servlet.Filter有两个重要的方法
public void init(FilterConfig config)
public void doFilter(ServletRequest request, ServletResponseresponse, 

  FilterChainchain)
其中init方法用来作一些初始化的方法,而doFilter方法用来执行真正的过滤操作。

2. Filter的部署方法
在web.xml中要声明filter元素,并分配需要其处理的url,如下:
<filter>
   <filter-name>Filter1</filter-name>
   <filter-class>com.test.Filter1</filter-class>
</filter>
<filter>
   <filter-name>Filter2</filter-name>
   <filter-class>com.test.Filter2</filter-class>
</filter>
<filter-mapping>
   <filter-name>Filter1</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
   <filter-name>Filter2</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>


Part 2 : Servlet Filter 顺序的注意事项

1.doFilter函数的执行顺序
当某个url请求匹配了多个Filter时,应用服务器将多个Filter组织成FilterChain,这个链的执行顺序是由其<filter-mapping>元素在web.xml文件中的顺序决定的。
doFilter函数可以过滤请求或者响应,当其过滤完请求后将调用FilterChain的doFilter函数让FilterChain中的下一个Filter来过滤请求。最先过滤请求的Filter将最后过滤相应,下面是个简单的例子。
public void doFilter(ServletRequest request, ServletResponseresponse,FilterChain chain) throws IOException,ServletException
{
      system.out.println(“filter request here ----”);
       //todo:
      chain.doFilter(request,response);
      system.out.println(“filter response here ----”);
       //todo:

}

2.init函数的执行顺序
  
1).filter的init方法在容器初始化时加载。第一次加载容器执行顺序随机,以后再次加载顺序以第一次加载顺序为准。
2).filter的doFilter方法在请求url时执行,如果有多个filter匹配,则按照<filter-mapping>顺序执行(前提是doFilter方法里面最后要调用FilterChain的doFilter方法,这个方法作用是继续执行下个filter,如果没有加,则不执行下面的filter)
3).serlvet的init方法
a.如果web.xml中配置了<load-on-startup>属性,则在Tomcat初始化时按其值从小到大的顺序加载所有servlet的init方法。
b.如果没有配置<load-on-startup>属性,容器初始化时不加载。在请求匹配的url时进行加载,并且只加载最后一个servlet的init方法。其他的servlet不加载。
4).servlet的doGet、doPost方法:在请求匹配的url路径时加载,而且只加载最后一个servlet的方法,其他方法不加载。

5).filter和servlet同时存在,且容器初始化都要加载,则先加载filter再加载servlet的init方法。
6).如果请求的url既匹配filter又匹配servlet,并且servlet的init方法没有在容器初始化加载,则先加载匹配的servlet的最后一个servlet的init方法,再按顺序执行filter方法,最后再执行匹配的最后一个servlet方法。 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值