概念
1、JavaWeb 的一个重要组件,可以对发送到 Servlet 的请求进行拦截,并对响应也进行拦截
2、Filter 是实现了 Filter 接口的 Java 类
3、Filter 需要在 web.xml 文件中进行配置和映射
使用
1、创建一个实现类,并实现于 Filter 接口
2、在 web.xml 文件中配置并映射该 Filter
注:其中 <url-pattern> 指定该 Filter 准备拦截哪些资源,或者从哪些 url 可以访问该 Filter
运行后,控制台第一次打印 init 方法,后面每次刷新都调用 doFilter 方法
Filter 相关 API
1、Filter 接口
⑴ public void init(FilterConfig filterConfig)
该方法类似于 Servlet 的 init 方法,被创建时调用,且只被调用一次,该方法用于对当前的 Filter 进行初始化操作,Filter 实例是单例的,其中参数 filterConfig 类似于 Servlet 的 ServletConfig 可以在 web.xml 文件中配置当前 Filter 的初始化参数
⑵ public void doFilter(ServletRequest servletRequest,ServletResponse servletResponse,FilterChain filterChain)
真正的 Filter 的逻辑代码都写在该方法中,每次拦截都会调用该方法。filterChain:Filter 链,多个 Filter 可以构成一个 Filter 链。
doFilter(ServletRequest servletRequest,ServletResponse servletResponse):把请求传给 Filter 链的下一个 Filter,若当前 Filter 是 Filter 链的最后一个 Filter,则把请求传给目标 Servlet(或 JSP)
注:多个 Filter 拦截的顺序和 <filter-mapping> 配置的顺序有关,靠前的先被调用
⑶ public void destroy()
释放当前 Filter 所占用的资源,在 Filter 被销毁之前被调用且只被调用一次
2、Filter 代码执行顺序
Dispatcher
指定过滤器所拦截的资源被 Servlet 容器调用的方式, 可以是 REQUEST,INCLUDE,FORWARD 和 ERROR 之一,默认为 REQUEST,同时可以设置多个 <dispatcher> 子元素用来指定 Filter 对资源的多种调用方式进行拦截
REQUEST:当用户之间访问页面时,web 容器将会调用过滤器,如果目标资源是通过 RequestDespatcher 的 include() 或 forward() 方法访问时,那么该过滤器就不会被调用。
INCLUDE:如果目标资源是通过 RequestDespatcher 的 include() 方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
FORWARD:如果目标资源是通过 RequestDespatcher 的 forward() 方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
ERROR:如果目标资源时通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用
配置方法如下:
使浏览器不缓存页面的过滤器
在 doFilter 里面同时设置三种响应头:
1、response.setDataHeader("Expires",-1)
2、response.setHeader("Cache-Control","no-cache")
3、response.setHeader("Pragma","no-cache")
字符编码过滤器
当页面传值出现中文乱码时,可以通过对过滤器设置编码来解决
以上为本人的一些学习笔记,如有出错欢迎指正,陆续更新!!!
网友评论