1,Filter
1.1 Filter概述
Filter 表示过滤器,是 JavaWeb 三大组件(Servlet、Filter、Listener)之一。Servlet 我们之前都已经学习过了,Filter和Listener 我们今天都会进行学习。
过滤器可以把对资源的请求==拦截==下来,从而实现一些特殊的功能。
如下图所示,浏览器可以访问服务器上的所有的资源(servlet、jsp、html等)

而在访问到这些资源之前可以使过滤器拦截来下,也就是说在访问资源之前会先经过 Filter,如下图
拦截器拦截到后可以做什么功能呢?
==过滤器一般完成一些通用的操作。==比如每个资源都要写一些代码完成某个功能,我们总不能在每个资源中写这样的代码吧,而此时我们可以将这些代码写在过滤器中,因为请求每一个资源都要经过过滤器。
我们之前做的品牌数据管理的案例中就已经做了登陆的功能,而如果我们不登录能不能访问到数据呢?我们可以在浏览器直接访问首页 ,可以看到 查询所有 的超链接

当我点击该按钮,居然可以看到品牌的数据

这显然和我们的要求不符。我们希望实现的效果是用户如果登陆过了就跳转到品牌数据展示的页面;如果没有登陆就跳转到登陆页面让用户进行登陆,要实现这个效果需要在每一个资源中都写上这段逻辑,而像这种通用的操作,我们就可以放在过滤器中进行实现。这个就是==权限控制==,以后我们还会进行细粒度权限控制。过滤器还可以做 统一编码处理、 敏感字符处理 等等...
1.2 Filter快速入门
进行 Filter 开发分成以下三步实现
-
定义类,实现 Filter接口,并重写其所有方法
-

-
配置Filter拦截资源的路径:在类上定义
@WebFilter注解。而注解的value属性值**/*表示拦截所有的资源** -

-
在doFilter方法中输出一句话,并放行
-

上述代码中的
chain.doFilter(request,response);就是放行,也就是让其访问本该访问的资源。
//放行
chain.doFilter(request,response);

1.3 Filter执行流程

如上图是使用过滤器的流程,我们通过以下问题来研究过滤器的执行流程:
-
放行后访问对应资源,资源访问完成后,还会回到Filter中吗?
从上图就可以看出肯定 ==会== 回到Filter中
-
如果回到Filter中,是重头执行还是执行放行后的逻辑呢?
如果是重头执行的话,就意味着
放行前逻辑会被执行两次,肯定不会这样设计了;所以访问完资源后,会回到放行后逻辑,执行该部分代码。

1.4 Filter拦截路径配置
拦截路径有如下四种配置方式:
-
拦截具体的资源:/index.jsp:只有访问index.jsp时才会被拦截
-
目录拦截:/user/*:访问/user下的所有资源,都会被拦截
-
后缀名拦截:*.jsp:访问后缀名为jsp的资源,都会被拦截
-
拦截所有:/*:访问所有资源,都会被拦截
通过上面拦截路径的学习,大家会发现拦截路径的配置方式和 Servlet 的请求资源路径配置方式一样,但是表示的含义不同。
1.5 过滤器链
过滤器链是指在一个Web应用,可以配置多个过滤器,这多个过滤器称为过滤器链

上图中的过滤器链执行是按照以下流程执行:
-
执行
Filter1的放行前逻辑代码 -
执行
Filter1的放行代码 -
执行
Filter2的放行前逻辑代码 -
执行
Filter2的放行代码 -
访问到资源
-
执行
Filter2的放行后逻辑代码 -
执行
Filter1的放行后逻辑代码
以上流程串起来就像一条链子,故称之为过滤器链。
2,Listener
2.1 概述
-
Listener 表示监听器,是 JavaWeb 三大组件(Servlet、Filter、Listener)之一。
-
监听器可以监听就是在
application,session,request三个对象创建、销毁或者往其中添加修改删除属性时自动执行代码的功能组件。request 和 session 我们学习过。而
application是ServletContext类型的对象。ServletContext代表整个web应用,在服务器启动的时候,tomcat会自动创建该对象。在服务器关闭时会自动销毁该对象。
2.2 分类
JavaWeb 提供了8个监听器:

这里面只有 ServletContextListener 这个监听器后期我们会接触到,ServletContextListener 是用来监听 ServletContext 对象的创建和销毁。
ServletContextListener 接口中有以下两个方法
-
voidcontextInitialized(ServletContextEvent sce):ServletContext对象被创建了会自动执行的方法 -
voidcontextDestroyed(ServletContextEvent sce):ServletContext对象被销毁时会自动执行的方法
我们只演示一下 ServletContextListener 监听器
-
定义一个类,实现
ServletContextListener接口 -
重写所有的抽象方法
-
使用
@WebListener进行配置
代码如下:

