过滤器的基本概念html
Servlet过滤器从字面上的字意理解为通过一层次的过滤处理才达到使用的要求,而其实Servlet过滤器就是服务器与客户端请求与响应的中间层组件,在实际项目开发中Servlet过滤器主要用于对浏览器的请求进行过滤处理,将过滤后的请求再转给下一个资源。java
Filter是在Servlet 2.3以后增长的新功能,当须要限制用户访问某些资源或者在处理请求时提早处理某些资源的时候,就可使用过滤器完成。web
过滤器是以一种组件的形式绑定到WEB应用程序当中的,与其余的WEB应用程序组件不一样的是,过滤器是采用了“链”的方式进行处理的。浏览器
Filter
服务器
Servlet过滤器Fileter是一个小型的web组件,它们经过拦截请求和响应,以便查看、提取或以某种方式操做客户端和服务器之间交换的数据,实现“过滤”的功能。Filter一般封装了一些功能的web组件,过滤器提供了一种面向对象的模块化机制,将任务封装到一个可插入的组件中, Filter组件经过配置文件来声明,并动态的代理。app
简单来讲Servlet的Filter是:jsp
● 声明式的:经过在web.xml配置文件中声明,容许添加、删除过滤器,而无需改动任何应用程序代码或jsp页面。模块化
● 灵活的:过滤器可用于客户端的直接调用执行预处理和后期的处理工做,经过过滤链能够实现一些灵活的功能。post
● 可移植的:因为现今各个web容器都是以Servlet的规范进行设计的,所以Servlet过滤器一样是跨容器的。网站
● 可重用的:基于其可移植性和声明式的配置方式,Filter是可重用的。
总的来讲,Servlet的过滤器是经过一个配置文件来灵活的声明的模块化可重用组件。过滤器动态的截获传入的请求和传出的响应,在不修改程序代码的状况下,透明的添加或删除他们。其独立于任何平台和web容器。
Filter体系结构
如其名字所暗示的同样,Servlet过滤器用于拦截传入的请求和传出的响应,并监视、修改处理web工程中的数据流。过滤器是一个可插入的自由组件。web资源能够不配置过滤器、也能够配置单个过滤器,也能够配置多个过滤器,造成一个过滤器链。Filter接受用户的请求,并决定将请求转发给链中的下一个组件,或者终止请求直接向客户端返回一个响应。若是请求被转发了,它将被传递给链中的下一个过滤器(以web.xml过滤器的配置顺序为标准)。这个请求在经过过滤链并被服务器处理以后,一个响应将以相反的顺序经过该链发送回去。这样,请求和响应都获得了处理。
Filter能够应用在客户端和Servlet之间、servlet和serlvet或jsp之间,以及jsp之间。而且能够经过配置信息,灵活的使用那个过滤器。
基于Filter体系结构的描述,咱们能够看出Filter的工做原理,简单的经过一幅流程图加以演示:
客户端浏览器在访问web服务器的某个具体资源的时候,通过过滤器1中code1代码块的相关处理以后,将request请求传递给过滤链中的下一个过滤器2,(过滤链的顺序以配置文件中的顺序为基准)过滤器2处理完以后,request就传递的Servlet完成相应的逻辑。返回响应的过程相似,只是过滤链的顺序相反,这里就很少说了。
要编写一个过滤器必须实现Filter接口。实现其接口规定的方法。
★ 实现javax.servlet.Filter接口
★ 实现init方法,读取过滤器的初始化参数
★ 实现doFilter方法,完成对请求或响应的过滤
★ 调用FilterChain接口对象的doFilter方法,向后续的过滤器传递请求或响应
一个最基本的过滤器实现代码:
java类:
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; public class BasicsFilter implements Filter { public BasicsFilter() { // 容器(服务器)启动时执行 } /** * @see Filter#init(FilterConfig) */ public void init(FilterConfig fConfig) throws ServletException { /* 容器(服务器)时执行 */ System.out.println("======== 初始化方法 ========"); // 获取的是web.xml中配置Filter时设置的值,参数为设置值得名称,若参数不存在,则返回空 String initParam = fConfig.getInitParameter("param"); System.out.println("param ========" + initParam); } /** * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain) */ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { /* 在访问的时候执行 */ System.out.println("======= 开始执行doFilter ========"); // 转发到下一个组件,进行后续的处理(组件能够是一个过滤器,也能够是一个servlet) chain.doFilter(request, response); System.out.println("======= 结束执行doFilter ========"); } /** * @see Filter#destroy() */ public void destroy() { // TODO Auto-generated method stub } }
web.xml配置:
<filter> <filter-name>basicsFilter</filter-name> <filter-class>com.hudongwu.filter.BasicsFilter</filter-class> <init-param><!-- 设置在过滤器中执行初始化方法时,获取的值 --> <param-name>param</param-name> <param-value>studyFilter</param-value> </init-param> </filter> <filter-mapping> <filter-name>basicsFilter</filter-name> <!-- 设置为访问该网站全部地址都须要经过该过滤器 --> <url-pattern>/*</url-pattern> <!-- 设置为只有访问该网站的/Helloword地址时才经过该过滤器 --> <url-pattern>/Helloword</url-pattern> </filter-mapping>