JavaWeb核心篇(5)——Filter和Listener
JavaWeb具有三大组件:Servlet,Filter,Listener
在之前的文章中,我们已经学习了Servlet,这篇文章我们来介绍Filter和Listener来补全这部分知识点
Filter
首先Filter的汉语意义为:过滤器
过滤器可以把对资源的请求拦截下来,并做出相应判断并考虑是否放行
过滤器通常用来实现一些特殊的功能,比如:权限控制,统一编码处理,敏感字符处理等
Filter执行流程
如上图是使用过滤器的流程,我们通过以下问题来研究过滤器的执行流程:
- 放行后访问对应资源,资源访问完成后,还会回到Filter中吗? 从上图就可以看出肯定 会回到Filter中
- 如果回到Filter中,是重头执行还是执行放行后的逻辑呢?
如果是重头执行的话,就意味着
放行前逻辑
会被执行两次,肯定不会这样设计了; 所以访问完资源后,会回到放行后逻辑
,执行该部分代码。
通过上述的说明,我们就可以总结Filter的执行流程如下:
其中执行放行前逻辑是针对request进行;而执行放行后逻辑是针对response进行的
Filter快速入门
进行 Filter
开发分成以下三步实现:
- 定义类,实现 Filter接口,并重写其所有方法
- 配置Filter拦截资源的路径:在类上定义
@WebFilter
注解。而注解的value
属性值/*
表示拦截所有的资源
- 在doFilter方法中输出一句话,并放行
上述代码中的
chain.doFilter(request,response);
就是放行,也就是让其访问本该访问的资源。
Filter拦截路径配置
Filter和Serlvet一样,我们采用注解的格式来标记使用地址
那么我们就可以根据使用要求来设置不同的Filter使用场景,配置不同的拦截资源
拦截路径主要分为四种:
- 拦截具体的资源:/index.jsp:只有访问/index.jsp才会被拦截
- 目录拦截:/user/*:访问/user目录下的所有资源,都会被拦截
- 后缀名拦截:*.jsp:访问jsp资源,都会被拦截
- 拦截所有:/*:访问所有资源,都会被拦截
Filter过滤器链
一个Web应用中,可以配置多个过滤器,这多个过滤器被称为过滤器链
其中的顺序为:
- 执行
Filter1
的放行前逻辑代码 - 执行
Filter1
的放行代码 - 执行
Filter2
的放行前逻辑代码 - 执行
Filter2
的放行代码 - 访问到资源
- 执行
Filter2
的放行后逻辑代码 - 执行
Filter1
的放行后逻辑代码
以上流程串起来就像一条链子,故称之为过滤器链。
注解配置的Filter,优先级按照过滤器类名(字符串)的自然排序来比较
Listener
Listener 表示监听器,是 JavaWeb 三大组件(Servlet、Filter、Listener)之一。
监听器可以监听在 application
,session
,request
三个对象创建、销毁或者往其中添加修改删除属性时自动执行代码的功能组件。
request 和 session 我们学习过。
而 application
是 ServletContext
类型的对象。
ServletContext
代表整个web应用,在服务器启动的时候,tomcat会自动创建该对象。在服务器关闭时会自动销毁该对象。
Listener分类
JavaWeb 提供了8个监听器:
这里面只有 ServletContextListener
这个监听器后期我们会接触到,ServletContextListener
是用来监听 ServletContext
对象的创建和销毁。
ServletContextListener
接口中有以下两个方法
void contextInitialized(ServletContextEvent sce)
:ServletContext
对象被创建了会自动执行的方法void contextDestroyed(ServletContextEvent sce)
:ServletContext
对象被销毁时会自动执行的方法
代码展示
我们只演示一下 ServletContextListener
监听器
- 定义一个类,实现
ServletContextListener
接口 - 重写所有的抽象方法
- 使用
@WebListener
进行配置
代码如下:
代码语言:javascript复制@WebListener
public class ContextLoaderListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
//加载资源
System.out.println("ContextLoaderListener...");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
//释放资源
}
}
启动服务器,就可以在启动的日志信息中看到 contextInitialized()
方法输出的内容,同时也说明了 ServletContext
对象在服务器启动的时候被创建了。
结束语
好的,关于Filter和Listener我们就介绍到这里
附录
该文章属于学习内容,具体参考B站黑马程序员陈老师的JavaWeb课程
这里附上链接:01-Filter-概述&快速入门&执行流程_哔哩哔哩_bilibili