web.xml过滤器 - filter
web.xml 过滤器 — 函数回调,指责链模式
1、 Filter作用
当客户端发出Web资源的请求时,Web服务器根据应用程序配置文件web.xml设置的过滤规则,能够在一个request到达servlet之前预处理request,也可以在离开servlet时处理response。 —— filter实际是一个servlet chaining(servlet 链)
-
在servlet被调用之前截获;
-
在servlet被调用之前检查servlet request;
-
根据需要修改request头和request数据;
-
在servlet被调用之后截获.
-
根据需要修改response头和response数据;
2、 过滤器生命周期的四个阶段:
-
实例化:Web容器在部署Web应用程序时对所有过滤器进行实例化。Web容器回调它的无参构造方法。
-
初始化:实例化完成之后,马上进行初始化工作。Web容器回调init()方法。
-
过滤:请求路径匹配过滤器的URL映射时。Web容器回调doFilter()方法——主要的工作方法。
-
销毁: Web容器在卸载Web应用程序前,Web容器回调destroy()方法。
3、 过滤器接口介绍
-
init(用来初始化)
-
dofilter(用来执行具体的操作)
此方法是由Servlet容器提供给开发者的,用于对资源请求过滤链的依次调用,通过FilterChain调用过滤链中的下一个过滤器,如果是最后一个过滤器,则下一个就调用目标资源。 -
destory(用来销毁)
4、拦截方式
-
request过滤器(默认):只有直接访问该目标资源时执行。包括:在地址栏中直接访问、表单提交、超链接、重定向
-
forward过滤器:转发访问执行过滤器。包括RequestDispatcher#forward()方法,标签都是转发访问;
-
include过滤器:包含访问执行过滤器。包括RequestDispatcher#include()方法,标签都是包含访问;
-
error过滤器:配置,出现该异常代码时,执行过滤器。
1 <filter> 2 <filter-name>patronliFilter</filter-name>//定义名字 3 <filter-class>com.servlet.DemoFilter</filter-class>//实现类 4 </filter> 5 <filter-mapping> 6 <filter-name>DemoFilter</filter-name> 7 <url-pattern>/*</url-pattern> 8 <!-- 过滤器拦截规则:request过滤器,include过滤器,forward过滤器,error过滤器 --> 9 <dispatcher>REQUEST</dispatcher> 10 <dispatcher>FORWARD</dispatcher> 11 </filter-mapping> 12 <!-- 如果想要配置多个拦截器,可以依次向下写 -->
1 import javax.servlet.Filter; //过滤器接口 2 import javax.servlet.FilterChain; //过滤器链接口 3 import javax.servlet.FilterConfig; //过滤器配置接口,getInitParameter方法用于获取web.xml中的初始化参数 4 5 public class DemoFilter implements Filter{ 6 protected FilterConfig config; 7 protected String encoding; 8 9 @Override //初始化的方法 10 public void init(FilterConfig config) throws ServletException { 11 this.config=config; 12 this.encoding = config.getInitParameter("encoding"); //通过init-param设置参数,在init中取得 13 } 14 15 @Override //执行过滤的方法 16 public void doFilter(ServletRequest arg0, ServletResponse arg1, 17 FilterChain arg2) throws IOException, ServletException { 18 request.setCharacterEncoding(encoding); 19 System.out.println("Do...before.."); 20 chain.doFilter(request, response); //由该方法进入下一过滤链。(filter拦截栈,后进先出) 21 System.out.println("Do..after..."); 22 } 23 24 @Override //销毁的方法 25 public void destroy() { 26 } 27 }
欢迎疑问、期待评论、感谢指点 -- kiqi,愿同您为友
-- 星河有灿灿,愿与之辉