Filter过滤器和Listener监听器

2023.10.26

Filter过滤器

        过滤器,顾名思义就是对事物进行过滤的。Web中的过滤器,就是对请求进行过滤,我们使用过滤器,就可以对请求进行拦截,然后做相应的处理,实现许多特殊功能。如登录控制,权限管理,过滤敏感词汇等。

        Filter可以在Servlet这个目标程序执行之前添加代码,也可以在目标Servlet执行之后添加代码,之前之后都可以添加过滤规则。一般情况下,都是在过滤器当中编写公共代码。所以通过过滤器可以实现代码重用的功能。

        如果同一个资源或同一组资源中应用了多个过滤器,则调用顺序显得比较重要,这时候就需要配置web.xml文件来控制其先后顺序。

如何实现一个过滤器?

  • 编写一个Java类实现一个接口:jarkata.servlet.Filter。并且实现这个接口当中所有的方法。
    • init方法:在Filter对象第一次被创建之后调用,并且只调用一次。
    • doFilter方法:只要用户发送一次请求,则执行一次。发送N次请求,则执行N次。在这个方法中编写过滤规则。
    • destroy方法:在Filter对象被释放/销毁之前调用,并且只调用一次。

  • 在web.xml文件中对Filter进行配置。这个配置和Servlet很像。也可以使用注解@WebFilter

ps:Filter的生命周期 和Servlet的声明周期基本一样,唯一区别就是Servlet对象默认情况下,在服务器启动的时候是不会新建对象的。而Filter对象默认情况下,在服务器启动的时候会新建对象。

ps:Filter的优先级,天生的就比Servlet优先级高。

  • 目标Servlet是否执行,取决于两个条件:

    • 第一:在过滤器当中是否编写了:chain.doFilter(request, response); 代码。

    • 第二:用户发送的请求路径是否和Servlet的请求路径一致。

Filter过滤器使用案例:

先编写一个filter类实现Filter接口:

package filter;import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;import java.io.IOException;@WebFilter("*.do")
public class filter1 implements Filter {public filter1() {System.out.println("无参构造执行了");}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("init方法执行了");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("doFilter方法执行了");// 执行下一个过滤器,如果下一个不是过滤器了,则执行目标程序Servlet。filterChain.doFilter(servletRequest,servletResponse);System.out.println("doFilter方法执行结束");}@Overridepublic void destroy() {System.out.println("destroy方法执行了");}
}

        chain.doFilter(request, response); 这行代码的作用: 执行下一个过滤器,如果下面没有过滤器了,执行最终的Servlet。

编写两个servlet类:

Aservlet:

package filter;import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;@WebServlet("/a.do")
public class Aservlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("Aservlet的doget方法执行了。");}
}

Bservlet:

package filter;import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;@WebServlet("/b.do")
public class Bservlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("Bservlet的doget方法执行了");}
}

注意两个servlet对应的路径必须以“.do”结尾,因为之前过滤器设定的路径是“ *.do ”。

然后在浏览器输入:http://localhost:8080/servlet09/a.do

控制台输出如下:

 

 然后在浏览器输入:http://localhost:8080/servlet09/b.do

控制台输出如下:

        如果有多个过滤器的情况:

①如果你是用注解进行配置的:过滤器执行顺序是根据Filter的类名来的。 比如:FilterA和FilterB,先执行FilterA。Filter1和Filter2,先执行Filter1。

②在web.xml文件中进行配置的时候,Filter的执行顺序是:从上至下依次执行。


Listener监听器

        Listener 是 Web 的三大组件之一,另外两大是Servlet(控制器)、Filter(过滤器)。

        Listener 可以 监听 JavaWeb 中的三大域对象:HttpServletRequest、HttpSession、ServletContext (创建和销毁),一旦被监视的对象发生相应的变化,应该采取相应的操作。

Servlet规范中提供了哪些监听器?

  • jakarta.servlet包下:

    • ServletContextListener(在context对象创建和销毁时调用,下同)

    • ServletContextAttributeListener(在context域的数据被修改时调用,下同)

    • ServletRequestListener

    • ServletRequestAttributeListener

  • jakarta.servlet.http包下:

    • HttpSessionListener

    • HttpSessionAttributeListener

      • 该监听器需要使用@WebListener注解进行标注。

      • 该监听器监听的是什么?是session域中数据的变化。只要数据变化,则执行相应的方法。主要监测点在session域对象上。

    • HttpSessionBindingListener

      • 该监听器不需要使用@WebListener进行标注。

      • 假设User类实现了该监听器,那么User对象在被放入session的时候触发bind事件,User对象从session中删除的时候,触发unbind事件。

      • 假设Customer类没有实现该监听器,那么Customer对象放入session或者从session删除的时候,不会触发bind和unbind事件。

    • HttpSessionIdListener(不常用)

      • session的id发生改变的时候,监听器中的唯一一个方法就会被调用。

    • HttpSessionActivationListener(不常用)

      • 监听session对象的钝化和活化的。

      • 钝化:session对象从内存存储到硬盘文件。

      • 活化:从硬盘文件把session恢复到内存。

实现一个监听器的步骤:

        以ServletContextListener为例,先编写一个类实现ServletContextListener接口,并且实现里面的方法。在web.xml文件中对ServletContextListener进行配置,或者使用注解@WebListener。这里直接使用注解,代码如下:

package listener;import jakarta.servlet.ServletContextEvent;
import jakarta.servlet.ServletContextListener;
import jakarta.servlet.annotation.WebListener;// ServletContextListener监听器主要监听的是:ServletContext对象的状态。
@WebListener
public class MyServletContextListener implements ServletContextListener {/*** 监听器中的方法不需要程序员手动调用。是发生某个特殊事件之后被服务器调用。* @param sce*/@Overridepublic void contextInitialized(ServletContextEvent sce) { // 服务器启动时间点,想在这个时候执行一段代码,写就行了。// 这个方法是在ServletContext对象被创建的时候调用。System.out.println("ServletContext对象创建了。");}@Overridepublic void contextDestroyed(ServletContextEvent sce) { // 服务器关闭时间点。// 现在这个特殊的时刻写代码,你写就是了。它会被服务器自动调用。// 这个方法是在ServletContext对象被销毁的时候调用。System.out.println("ServletContext对象被销毁了。");}
}

此时启动服务器,控制台显示如下:

关闭服务器,控制台显示如下:

        

        

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/119697.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp开发小程序—picker结合后台数据实现二级联动的选择

一、效果图 二、完整代码 <template><view><picker mode"multiSelector" change"bindMultiPickerChange" columnchange"bindMultiPickerColumnChange":value"multiIndex" :range"multiArray"><view c…

基于FPGA的电风扇控制器verilog,视频/代码

名称&#xff1a;基于FPGA的电风扇控制器verilog 软件&#xff1a;QuartusII 语言&#xff1a;Verilog 代码功能&#xff1a; 基于FPGA的电风扇控制器 运用 EDA SOPO实验开发系统设计一个基于FPGA的电风扇定时开关控制器,能实现手动和自动模式之间的切换。要求: (1)KI为电…

【Gensim概念】03/3 NLP玩转 word2vec

第三部分 对象函数 八 word2vec对象函数 该对象本质上包含单词和嵌入之间的映射。训练后&#xff0c;可以直接使用它以各种方式查询这些嵌入。有关示例&#xff0c;请参阅模块级别文档字符串。 类型 KeyedVectors 1&#xff09; add_lifecycle_event(event_name, log_level2…

@AutoConfigurationPackage注解类

包名package org.springframework.boot.autoconfigure 方法 String[] basePackages() 向AutoConfigurationPackages中注册的基本包&#xff0c;使用basePackageClasses作为基于字符串的包的类型安全替代方案 Class<?>[] basePackageClasses() 键入basePackage…

APP破解去广告

1.修改图标和名称 名称直接改 找到图标在进去把他替换掉 2.修改app包名实现分身 修改包名实现app分身_Tian翊的博客-CSDN博客 3.修改资源去广告 安卓逆向006之修改APK资源去广告_修改安装包去除app内广告-CSDN博客 打开模拟器后在cmd命令行输入adb devices连接上 在模拟器中…

【多线程】探索Java中的多线程编程

标题&#xff1a;探索Java中的多线程编程 摘要&#xff1a; Java是一种广泛使用的编程语言&#xff0c;具有强大的多线程编程能力。本文将深入探讨Java中的多线程编程&#xff0c;包括线程的创建、同步与互斥、线程池的使用以及常见的多线程编程模式。通过示例代码和详细解释&…

每日一练——返回链表的中间结点

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary-walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…

【单元测试】--维护和改进单元测试

一、持续维护单元测试 持续维护单元测试是确保它们继续有效的关键。以下是一些方法来保持单元测试的可维护性&#xff1a; 集成单元测试到持续集成流程&#xff1a;将单元测试包括在持续集成&#xff08;CI&#xff09;流程中&#xff0c;确保它们在每次代码更改后都自动运行…

Dockerfile文件自动化生成R4L镜像

Dockerfile文件自动化生成R4L镜像的步骤 1、安装Docker&#xff1a;2、使用Dockerfile一键生成镜像&#xff1a;3、查看生成的Docker镜像&#xff1a;4、删除Docker镜像&#xff1a;5、生成Docker容器&#xff1a;6、查看容器7、删除容器 1、安装Docker&#xff1a; curl -fsS…

sqoop和flume简单安装配置使用

1. Sqoop 1.1 Sqoop介绍 Sqoop 是一个在结构化数据和 Hadoop 之间进行批量数据迁移的工具 结构化数据可以是MySQL、Oracle等关系型数据库 把关系型数据库的数据导入到 Hadoop 与其相关的系统 把数据从 Hadoop 系统里抽取并导出到关系型数据库里 底层用 MapReduce 实现数据 …

如何巧妙告知家长成绩分数

如何让学生和家长们查询期中考试成绩,一直是让许多老师都头疼不已的问题。今天我就来交给大家怎么解决这个问题。 我们先了解一下成绩查询系统是什么。在互联网高度发达的今天&#xff0c;成绩查询系统已经不再是学校的专属&#xff0c;而是可以通过网络平台进行操作的一种工具…

LVS负载均衡(LVS简介、三种工作模式、十种调度算法)

LVS简介 LVS&#xff08;Linux Virtual Server&#xff09;是一种基于Linux内核的高可用性负载均衡软件。它通过将客户端请求分发到多个后端真实服务器&#xff0c;提高系统性能和可靠性。LVS支持多种调度算法&#xff0c;如轮询、最少连接、源地址哈希等&#xff0c;用于决定…

利用MATLAB创建栅格地图(代码可复制)

先做一个声明&#xff1a;文章是由我的个人公众号中的推送直接复制粘贴而来&#xff0c;因此对智能优化算法感兴趣的朋友&#xff0c;可关注我的个人公众号&#xff1a;启发式算法讨论。我会不定期在公众号里分享不同的智能优化算法&#xff0c;经典的&#xff0c;或者是近几年…

解决msvcp120.dll丢失的问题的5个方法,修复系统dll问题

在使用计算机的过程中&#xff0c;我们经常会遇到各种各样的动态链接库&#xff08;DLL&#xff09;文件。其中之一就是“msvcp120.dll丢失”。这个错误通常会导致某些应用程序无法正常运行。为了解决这个问题&#xff0c;我们需要找到合适的方法来修复丢失的msvcp120.dll文件。…

MVCC 过程中会加锁吗?

MVCC 机制&#xff0c;全称&#xff08;Multi-Version Concurrency Control&#xff09;多版本并发控制&#xff0c;是确保 在高并发下&#xff0c; 多个事务读取数据时不加锁也可以多次读取相同的值。 MVCC 在读已提交&#xff08;READ COMMITTED&#xff09;、可重复读&…

损失函数和评估函数

损失函数和目标函数定义 损失函数是用于衡量模型在训练过程中预测结果与实际结果之间的差异的函数。它通过计算模型的预测值与实际值之间的距离或差异来 quantitatively 表示模型的性能好坏。损失函数通常被用作优化算法(如梯度下降)的目标函数,通过最小化损失函数来调整模…

汽车发动机电机右盖设计

摘要 随着我国微型电子技术和社会经济的发展&#xff0c;目前行业内为满足客户需求出现了大量的电器设备&#xff0c;而大多数的电气设备的重要组成中都有电机&#xff0c;并且电机端盖成为电机研发人员重点关注和研究的对象&#xff0c;逐渐成为电机的重要组成部分&#xff0c…

Scala【集合常用方法和函数操作(下)】

Fold、FoldLeft 和 FoldRight object Test03_Fold {def main(args: Array[String]): Unit {// 称作集合外的参数val list List(1,2,3,4)// fold的底层仍然是调用的 foldLeft// 第一个参数是一个值(称作集合内的参数&#xff0c;必须和集合外的参数类型一致)// 第二个参数是一…

linux信号驱动IO(高级字符设备四)

一、linux信号驱动IO介绍 信号驱动 IO 不需要应用程序查询设备的状态&#xff0c;一旦设备准备就绪&#xff0c;会触发SIGIO信号&#xff0c;进而调用注册的处理函数。 1.1、linux信号驱动IO应用层 如果要实现信号驱动 IO&#xff0c;需要应用程序和驱动程序配合&#xff0c;应…

SpringSecurity分布式安全框架

Spring Security是一个基于Spring框架的安全框架&#xff0c;它提供了全面的安全解决方案&#xff0c;包括用户认证和用户授权等Web应用安全性问题。Spring Security可以轻松扩展以满足自定义需求&#xff0c;它的真正强大之处在于它可以轻松扩展以满足自定义要求。 对于分布式…