过滤器介绍
Filter 过滤器是 JavaWeb 三大组件之一(Servlet 程序、Listener 监听器、Filter 过 滤器)。过滤器可以拦截不正确的请求(大部分请求都有一个正确的访问流程,不可跳过,例如:一个登录页面要用户名密码正确才能登录访问,不能跳过登录页面直接访问登陆成功之后的页面),
Filter 过滤器基本原理
Filter 过滤器 url-patter
1、url-pattern : Filter 的拦截路径, 即浏览器在请求什么位置的资源时,过滤器会进行拦截过 滤
2.、精确匹配 /a.jsp 对应的 请求地址 http://ip[域名]:port/工程 路径/a.jsp 会拦截
3、目录匹配 /manage/*对应的 请求地址 http://ip[域名]:port/ 工程路径/manage/xx , 即 web 工程 manage 目录下所有资源 会拦截
4、后缀名匹配 *.jsp 后缀名可变,比如 *.action *.do 等等对应 的 请求地址 http://ip[域名]:port/工程路径/xx.jsp , 后缀名为 .jsp 请求会拦截
5、Filter 过滤器它只关心请求的地址是否匹配,不关心请求的资源是否存在
Filter 过滤器生命周期
Web工程启动时会执行构造器和init初始化方法,过滤器实例生效。当Tomcat接收到HTTP请求,会查看请求是否匹配过滤器Filter的路径url-pattern,匹配就调用doFilter()方法。当Web工程停止或重启时,会调用destory()方法销毁Filter实例。
FilterConfig 说明
1. FilterConfig 是 Filter 过滤器的配置类
2. Tomcat 每次创建 Filter 的时候,也会创建一个 FilterConfig 对象,这里包含了 Filter 配 置文件的配置信息。
3. FilterConfig 对象作用是获取 filter 过滤器的配置内容
FilterChain 过滤器链
FilterChain: 在处理某些复杂业务时,一个过滤器不够,可以设计多个过滤器 共同完成过滤任务。一个过滤器执行自己的前置就会调用下一个过滤器直到调用到资源,然后返回过滤器的后置代码,返回上一个过滤器的后置代码,这样过滤器之间相连形成过滤器链(前置代码和后置代码自己配)。 过滤器的调用顺序是按照web.xml里面的配置顺序进行调用。
FilterChain 注意事项和细节
1. 多个 filter过滤器 和目标资源在一次 http 请求,在同一个线程中
2. 当一个请求 url 和 filter 的 url-pattern 匹配时, 才会被执行, 如果有多个匹配上,就会 顺序执行,形成一个 filter过滤链(底层可以使用一个数据结构搞定)。
3. 多个 filter 共同执行时,在同一次 http 请求, 使用同一个 request 对像
4. 多个 filter 执行顺序,和 web.xml 配置顺序保持一致.
5. chain.doFilter(req, resp)方法 将执行下一个过滤器的 doFilter 方法, 如果后面没有过滤器, 则执行目标资源。
6. 小结:执行过滤器链时, 顺序是Http请求 -> A 过滤器 dofilter() -> A 过滤器前置代码 -> A 过滤器 chain.doFilter() (调用下一个过滤器Filter)-> B 过滤器 dofilter() -> B 过滤器前置代 码 -> B过滤器 chain.doFilter() -> 目标文件 -> B过滤器后置代码 -> A过滤器后置代码 -> 返回给浏览器页面/数据