目录
生命的意义却似轮回
每个人都得从头寻找
唯在这寻找中才可能与前贤汇合
若在山腰止步
登峰之路岂不又被埋没?
------ 24.10.13
一、过滤器概述
Filter,即过滤器,是JavaEE技术规范之一,作用目标资源的请求进行过滤的一套技术规范,是JavaWeb项目中最为实用的技术之一
Filter接口定义了过滤器的开发规范,所有的过滤器都要实现该接口
filter的工作位置是项目中所有目标资源之前,容器在创建HtpServletRequest和
HtpServletResponse对象后,会先调用Filter的doFilter方法
Filter的doFilter方法可以控制请求是否继续,如果放行,则请求继续,如果拒绝,则请求到此为止,由过滤器本身做出响应
Filter不仅可以对请求做出过滤,也可以在目标资源做出响应前,对响应再次进行处理
Filter是GOF中责任链模式的典型案例
Filtler的常用应用包括但不限于::登录权限检查、解决网站乱码、过滤敏感字符,日志记录,性能分析........
生活举例:公司前台,停车场安保系统,地铁检票闸机
公司前台对来访人员进行审核,如果是游客则拒绝进入公司,如果是客户则放行,客户离开时提醒客户不要遗忘物品
停车场保安对来访车辆进行控制,如果没有车位拒绝进入,如果有车位,发放停车卡并放行,车辆离开时收取停车费
地铁验票闸机在人员进入之前检查票,没票拒绝进入,有票验票后放行,人员离开时同样验票
过滤器开发中应用场景
① 日志的记录 ② 性能的分析 ③ 乱码的处理
④ 事务的控制 ⑤ 登录的控制 ⑥ 跨域的处理
......
过滤器工作位置图解
Filter接口API:
初始化方法,由容器调用并传入初始配置信息 filterConfig 对象
java
default public void init(FilterConfig filterConfig)
过滤方法,核心方法,过滤请求,决定是否放行响应之前的其他处理等都在该方法中
java
public void doFilter(ServletRequest request,
ServletResponse response, FilterChain chain)
销毁方法,容器在回收过滤器对象之前调用的方法
java
default public void destroy();
二、过滤器过滤过程图解
三、过滤器生命周期
过滤器作为web项目的组件之一,和Servlet的生命周期类似,略有不同,有servlet的load-on- startup的,默认就是系统启动立刻构造。
阶段 对应方法 执行时机 执行次数
创建对象 构造器 web应用启动时 1
初始化方法 void init(FilterConfig filterConfig) 构造完毕 1
过滤请求 void doFilter(ServletRequest servletRequest,ServletResponse servletResponse,FilterChain filterChain) 每次请求 多次
销毁 default void destroy() web应用关闭时 1
四、过滤器链的使用
一个web项目中,可以同时定义多个过滤器,多个过滤器对同一个资源进行过滤时,工作位置有先后,整体形成一个工作链,称之为过滤器链
过器中的过滤器的顺序由 filter-mapping 顺序决定;
每个过滤器过滤的范围不同,对同一个资源来说,过过滤器中的过滤器个数可能是不同的;
如果某个Filter是使用ServletName进行匹配规则的配置,那么这个 Filter 执行的优先级要更低
工作流程图解
注解方式配置过滤器
XML方式配置
XML
<!--配置filter,并为filter起别名-->
<filter>
<filter-name>loggingFilter</filter-name>
<filter-class>com.atguigu.filters.LoggingFilter</filter-class>
<!--配置filter的初始参数-->
<init-param>
<param-name>dateTimePattern</param-name>
<param-value>yyyy-MM-dd HH:mm:ss</param-value>
</init-param>
</filter>
<!--为别名对应的filter配置要过滤的目标资源-->
<filter-mapping>
<filter-name>loggingFilter</filter-name>
<!--通过映射路径确定过滤资源-->
<url-pattern>/servletA</url-pattern>
<!--通过后缀名确定过滤资源-->
<url-pattern>*.html</url-pattern>
<!--通过servlet别名确定过滤资源-->
<servlet-name>servletB ame</servlet-name>
</filter-mapping
注解方式配置过滤器
java
@WebFilter(
filterName = "loggingFilter",
initParams = { @WebInitParam(name="dateTimePattern",value="yyyy-MM-dd
HH:mm:ss")},
urlPatterns = {"/servletA","*.html"},
servletNames = {"servletBName"}
)
public class LoggingFilter implements Filter {
/* 内部代码 略 */
}