filter 是一个过滤器, 能够对请求进行拦截, 通常用于登录验证, 处理编码, 敏感字符过滤等
创建Filter
filter 是一个 class, 使用 idea 等编译器可以直接创建, 该类实现了 Filter 接口
该类需要配置才能使用, 配置拦截的路径, 方式等
关键方法 : doFilter
使用 doFilter 方法, 写上你要处理的逻辑代码, 该方法三参数, request, response, filterchain, 分别代表请求对象, 响应对象, 以及过滤链对象
其中 filterchain 对象, 有一个方法, filterChain.doFilter(servletRequest,servletResponse); 表示放行, 在它之前的代码表示对请求的处理, 在它之后的代码表示对响应的处理
对于 filter 的另外 2 个方法, init 和 destroy 表示web容器启动和销毁的处理
配置filter
filter 可以使用 web.xml 或 @WebFilter 注解, 例如
<filter>
<filter-name>demo1</filter-name>
<filter-class>com.52dixiaowo.web.filter.FilterDemo1</filter-class>
</filter>
<filter-mapping>
<filter-name>demo1</filter-name>
<!-- 拦截路径 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
对于拦截路径, 下面有 4 种简单的方式, 还可以自由组合
- 具体资源路径: /index.jsp 只有访问index.jsp资源时,过滤器才会被执行
- 拦截目录: /user/* 访问/user下的所有资源时,过滤器都会被执行
- 后缀名拦截: *.jsp 访问所有后缀名为jsp资源时,过滤器都会被执行
- 拦截所有资源:/* 访问所有资源时,过滤器都会被执行
对于请求方式, 还可以选定哪种请求, 需要设置dispatcherTypes属性
- REQUEST:默认值。浏览器直接请求资源, 也可以同时设置多个值
- FORWARD:转发访问资源
- INCLUDE:包含访问资源
- ERROR:错误跳转资源
- ASYNC:异步访问资源
filter 过滤链的顺序问题: 如果是web.xml是按照<filter-mapping>的顺序, 而注解则是类名字符串大小, 比如 AFilter 比 BFilter先拦截.