Filter过滤器

来源:互联网 发布:淘宝刷手p图软件哪个好 编辑:程序博客网 时间:2024/06/06 10:31

Filter时servlet的一个高级特性,Servlet 发 Filter也是体现设计模式中的Filter;Filter是职责链模式的一种体现, 对于Filter而言就是,请求传给具体的web资源(比如jsp/servlet)之前要经过Filter的预处理,在web资源处理完成返回给客户端之前也要被Filter处理一遍。指责链喔给大家说一例子:好比一个来百姓要上京告御状,告的证实皇上的大舅子,因为这个大舅子在民间以强权其他百姓,现在百姓要状告他。告御状要把状纸呈上去,先给了地方芝麻县令,县令一看这是我管不了,就上传到知州,知府,按察使...等等...最后到皇上手中,一看大怒,后面就不说了。这个传递的过程就是一个职责链,每个部分都有相应的职责,谁能处理就要谁来处理。Filter只不过是在职责链上加了一个条件,就形成了过滤器。(这是我的理解,哪位有不同的理解,可以一起探讨学习)

Filter是servlet的高级特性,那当然也是servlet的一种;Filter需要实现Java中的Filter接口。其运行过程同servlet大经相同,只不过是把doGET和doPOST方法改装成为doFilter了,要在xml文件中配置;但是和servler不同servlet是在servlet的init方法第一次被访问时执行,而Fliter的init是在容器初始化时被执行。

Filter的执行过程:

package com.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;
import javax.servlet.annotation.WebFilter;
/**
 * Servlet Filter implementation class filterOne
 */
@WebFilter("/filterOne")
public class filterOne implements Filter {
    /**
     * Default constructor. 
     */
    public filterOne() {
        // TODO Auto-generated constructor stub
    System.out.println("====构造函数=====");
    }
/**
* @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
System.out.println("====销毁方法=====");//
}
/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
// place your code here
System.out.println("====执行dofilter方法=====");
// pass the request along the filter chain
chain.doFilter(request, response);//调用此方法奖执行下一个组件
System.out.println("====结束doFliter方法=====");
}/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
System.out.println("====初始化方法====");
String initParam=fConfig.getInitParameter("param");//获取配置参数
System.out.println(initParam);
}
}

xml文件配置:


 

  <filter>

  <filter-name>filterone</filter-name>

  <filter-class>com.filter.filterOne</filter-class>

  <init-param>

  <param-name>param</param-name>

  <param-value>likang</param-value>

  </init-param>

  </filter>

  <filter-mapping>

  <filter-name>filterone</filter-name>

  <url-pattern>/*</url-pattern>

  </filter-mapping>

Filter会在tomcat服务器启动的时候调用构造函数,我初始化方法。在调用servlet时调用Fliter的doFliter方法,doFilter会在setvlet中的service调用之前进行调用,起到过滤作用,在service方法执行完毕,调用chain.doFilter(request, response)方法。

Filter是一个弹性的机制,功能强大,而且与servlet和jsp没有耦合,可以自由拆卸。Filter是现在Aop(面向切面编程)的思想的一种体现。如果有多个Filter要注意配置顺序,放置相互影响;

以上是我在学习Filter时总结的,望大家多多指教,共同进步;






0 0