一、概述
(一)简介
Filter:过滤器,是Servlet规范的一种(接口)。过滤器作用在请求到达服务器后,到达目标资源之前,可以对request对象和response对象做一些预处理,之后再放行请求把request和response交给目标资源。
(二)快速入门
1. 创建Java类,实现Filter接口
2. 重写接口的方法(共3个方法,学习3个,重点关注1个:doFilter方法)
3. 把Filter配置到web.xml中
二、Filter的API
(一)Filter的API 1.init(FilterConfig config)
初始化方法,当前过滤器对象被创建时,服务器软件会调用这个方法 参数:FilterConfig
是当前过滤器的配置信息对象,由服务器软件创建并传递进来的。
作用:
1. 获取过滤器的名称 String filtername = config.getFilterName();
2. 获取初始化参数 String value = config.getInitParameter(String name); Enumeration names = config.getInitParameterNames();
3. 获取ServletContext对象 ServletContext context = config.getServletContext(); 2.doFilter(ServletRequest,
ServletResponse, FilterChain) 执行过滤操作的方法,每次拦截到请求时,服务器软件必定会执行这个方法 参数:
ServletRequest:代表http请求的request对象
ServletResponse:代表http响应的response对象
FilterChain:过滤器链对象,里边维护了所有要执行的过滤器的队列
chain.doFilter(request, response);//用来放行请求的 3.destory() 销毁方法,当前过滤器对象被销毁时,服务器软件会调用这个方法 (二)Filter的生命周期
1. Filter对象什么时候创建的? 服务器启动时创建的,创建时会执行init方法,由服务器软件创建的,一个Filter类只有一个对象存在
2. Filter对象什么时候销毁的? 服务器关闭时销毁的,正常销毁时会执行destory方法
3. 每次拦截到请求,必定会执行的方法是哪个? 必定会执行doFilter方法。过滤器的过滤代码要放在doFilter方法里边
三、Filter的配置
<!-- 注册过滤器类 -->
<filter>
<!-- filter-name:过滤器的名称,不重复即可 -->
<filter-name>demo01Filter</filter-name>
<!-- filter-class:过滤器类的全路径,服务器软件根据这个值通过反射来创建过滤器对象 -->
<filter-class>com.itheima.filter.Demo01Filter</filter-class>
<!-- init-param:初始化参数配置,一个过滤器可以有多个初始化参数配置 -->
<init-param>
<param-name>aa</param-name>
<param-value>AA</param-value>
</init-param>
<init-param>
<param-name>bb</param-name>
<param-value>BB</param-value>
</init-param>
</filter>
<!-- 配置过滤器拦截哪些路径 -->
<filter-mapping>
<!-- filter-name:给谁配置拦截的路径 -->
<filter-name>demo01Filter</filter-name>
<!--
url-pattern:过滤器的拦截路径配置
1. 完全匹配 /target
2. 目录匹配 以/开头, 以*结尾,用的最多
3. 扩展名匹配 以*开头,以扩展名结尾
注意:
1. 目录匹配和扩展名匹配不能混用
2. 一个过滤器,可以配置多个url-pattern
3. 多个过滤器可以拦截同一个请求,过滤器的拦截顺序和url-pattern的顺序有效,谁在前谁先拦截。无关url-pattern优先级
-->
<url-pattern>/*</url-pattern>
<!--
dispatcher:过滤器的拦截方式。
REQUEST:默认的拦截方式,拦截客户端发起请求
FORWARD:拦截请求转发,指的是转发时的请求。
INCLUDE:拦截动态包含的请求。
ERROR:拦截错误页面显示的请求。拦截的是在web.xml中配置的error-page标签
-->
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
//补充:web.xml错误页面的配置
<error-page>
<error-code>500</error-code>
<location>/error.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/404.jsp</location>
</error-page>
四、过滤器的应用(了解)
- 对request和response进行预处理
- 公共代码提取
- 权限控制 拦截/admin/*,判断如果是管理员放行,否则不放行