filter 用于动态 拦截请求和响应。其可以在
- 在客户端的请求访问后端资源之前,拦截这些请求。
- 在服务器的响应发送回客户端之前,处理这些响应。
简介
过滤器接口
1 | public interface Filter { |
上面3个方法中,doFilter()最为重要: 服务器请求符合过滤范围的servlet和jsp页面都会执行该方法。
若不让该请求最终访问到资源,需要在最后执行 chain.doFilter()操作。
若需要让该请求最终访问到资源,则方法体中不能出现 chain.doFilter()操作。
关联的类介绍
FilterConfig
FilterConfig 与 ServletConfig 类似,拥有四个方法
- getInitParameter():获取初始化参数。
- getInitParameterNames():获取所有初始化参数的名称。
- getFilterName():获取过滤器的配置名称。
- getServletContext():获取ServletContext。
FilterChain
该类仅一个方法 doFilter(), 该方法被FilterChain对象调用,表示对Filter过滤器过滤范围下的资源进行放行。
1 | public interface FilterChain { |
过滤器执行顺序
对于 xml 配置模式: 在同一匹配url下,其执行顺序按照web.xml中的注册顺序。
由于 @WebFilter 没有 order 属性,因此只能通过在 web.xml 中配置相关参数来 order filter
过滤器拦截方式
过滤器有四种拦截方式!分别是:REQUEST、FORWARD、INCLUDE、ERROR。
REQUEST
该方式为默认的拦截方式.
直接访问目标资源时执行过滤器。包括:在地址栏中直接访问、表单提交、超链接、重定向,只要在地址栏中可以看到目标资源的路径,就是REQUEST;
FORWARD
转发访问执行过滤器。包括RequestDispatcher#forward()方法,<jsp:forward>
标签都是转发访问;
INCLUDE
包含访问执行过滤器。包括RequestDispatcher#include()方法,<jsp:include>
标签都是包含访问;
ERROR
当目标资源在web.xml中配置为
创建过滤器
1 | "/*", displayName = "timeLogFilter", filterName = "timeLogFilter") (urlPatterns = |
常用的拦截器场景
- 权限控制
- 接口的耗时统计
- 统计不同IP访问次数
- 对非标准流编码的请求解码
- 等等
拦截器注意点
- 在filter中尽量不要使用流的访问获取参数,因为使用流后,servlet就会取不到请求参数了