一.过滤器简介
1.Filter也称之为过滤器,它是Servlet技术中最实用的技术,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
2.它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理。使用Filter的完整流程:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。
3.特点
(1)过滤器是双向的.
(2)可以有多个过滤器
(3)过滤器不是目标资源,是访问目标资源前后执行的,拦截的是一堆目标资源.
二.Filter入门
1.简单实现
(1)编写一个类,实现filter接口,重写3个方法
(2)在web.xml中进行配置(与servlet配置方法相同):
<filter>
<filter-name>FilterDemo_01</filter-name>
<filter-class>Filter.FilterDemo_01</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterDemo_01</filter-name>
<url-pattern>/felter1</url-pattern>
</filter-mapping>
2.FilterChain对象
(1)doFilter(ServletRequest request, ServletResponse response) 执行下一个过滤器,如果没有下一个过滤器,访问目标资源。
3.过滤器的生命周期
void init(FilterConfig filterConfig) --服务器启动的时候创建过滤器实例(单例的),默认调用init方法进行初始化操作,
void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) -- 放行,初始化之后就会执行,有一次执行一次。
void destroy() -- 过滤器是关闭服务器或者移除项目销毁,销毁之前调用destroy方法进行销毁。
三.FilterConfig接口
String getFilterName() -- 获取<filter-name>的名称
String getInitParameter(String name) -- 获取初始化参数的值(重点)
Enumeration getInitParameterNames() -- 获取初始化参数(重点)
ServletContext getServletContext() -- 获取ServletContext域对象(重点)
四.过滤器的配置
1.配置<filter>
<filter-name> -- 配置filter的名称
<filter-class> -- 包名+类名
<init-param> -- 配置初始化参数
2.配置<filter-mapping>
<filter-name> -- 配置filter的名称和<filter>标签中的<filter-name>配置必须是相同的。
<url-pattern> -- 配置过滤的路径
完全路径匹配 以/开头的 /aa /aa/bb localhost/litBlue_filter/aa/bb
目录匹配 以/开头的 /* /aa/* localhost/litBlue_filter/aa/bb
扩展名匹配 不能以/开头 *.jsp 访问所有的jsp都会被拦截
注意:
(1)优先级:完全路径 > 目录匹配 > 扩展名匹配
(2) 在web.xml中配置2个(A,B)过滤器,每个过滤器的配置都是/* AB过滤器执行顺序和在web.xml中的配置(<filter-mapping>)顺序有关。
<servlet-name> -- 过滤器过滤指定的servlet 直接配置Servlet的名称
<dispatcher>
REQUEST -- 默认只拦截请求。REQUEST也是默认值。
FORWARD -- 只拦截转发的
INCLUDE -- 包含
ERROR -- 需要在web.xml进行配置