filter & listener

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应用,可以配置多个过滤器,这多个过滤器称为过滤器链

上图中的过滤器链执行是按照以下流程执行:

  1. 执行 Filter1 的放行前逻辑代码

  2. 执行 Filter1 的放行代码

  3. 执行 Filter2 的放行前逻辑代码

  4. 执行 Filter2 的放行代码

  5. 访问到资源

  6. 执行 Filter2 的放行后逻辑代码

  7. 执行 Filter1 的放行后逻辑代码

以上流程串起来就像一条链子,故称之为过滤器链。

2,Listener

2.1 概述

  • Listener 表示监听器,是 JavaWeb 三大组件(Servlet、Filter、Listener)之一。

  • 监听器可以监听就是在 applicationsessionrequest 三个对象创建、销毁或者往其中添加修改删除属性时自动执行代码的功能组件。

    request 和 session 我们学习过。而 applicationServletContext 类型的对象。

    ServletContext 代表整个web应用,在服务器启动的时候,tomcat会自动创建该对象。在服务器关闭时会自动销毁该对象。

2.2 分类

JavaWeb 提供了8个监听器:

这里面只有 ServletContextListener 这个监听器后期我们会接触到,ServletContextListener 是用来监听 ServletContext 对象的创建和销毁。

ServletContextListener 接口中有以下两个方法

  • void contextInitialized(ServletContextEvent sce)ServletContext 对象被创建了会自动执行的方法

  • void contextDestroyed(ServletContextEvent sce)ServletContext 对象被销毁时会自动执行的方法

我们只演示一下 ServletContextListener 监听器

  • 定义一个类,实现ServletContextListener 接口

  • 重写所有的抽象方法

  • 使用 @WebListener 进行配置

代码如下:

相关推荐
勿芮介3 小时前
【研发工具】Jenkins镜像源配置问题及解决方案
运维·servlet·jenkins
tang7451639621 天前
Huawei Cloud EulerOS 2.0(x8664)安装 Jenkins
java·servlet·jenkins
砍材农夫2 天前
物联网 基于netty核心实战-心跳保活机制
java·后端·物联网·struts·servlet·netty
李少兄2 天前
深入理解 Web 服务器、Servlet 容器与现代 Java Web 架构
java·服务器·servlet
范什么特西10 天前
idea里面jsp找不到图片
java·开发语言·servlet
多敲代码防脱发11 天前
Spring进阶(Bean的生命周期与Bean的后处理器)
java·服务器·开发语言·spring boot·spring·servlet
甲方大人请饶命11 天前
Java-面向对象进阶之接口与内部类
java·开发语言·servlet
解决问题no解决代码问题13 天前
Quartz 1.6.5
数据库·servlet·oracle
Linux运维技术栈13 天前
Jenkins服务器更新密钥后任务构建不了?排查实录与解决方案
服务器·servlet·jenkins