JavaWeb中的Filter(过滤器)和 Listener(监听器)

提示:这两个东西听起来似乎很难,实际上是非常简单的,按照要求写就行了,一定不要被新名词给吓到了。

JavaWeb中的Filter(过滤器)

  • 一、Filter(过滤器)
    • 1.如何编写 Filter
    • 2.Filter 中的细节
    • 3.Filter 总结
  • 二、Listener(监听器)
    • 1.Servlet规范中提供的监听器
    • 2..如何实现 Listener
    • 3.Listener 应用场景


一、Filter(过滤器)

  • Filter 可以在 Servlet 这个目标程序执行之前添加代码。也可以在目标 Servlet 执行之后添加代码。之前之后都可以添加过滤规则。
  • 一般情况都是在过滤器中编写公共代码。
    在这里插入图片描述

1.如何编写 Filter

  • 第一步:编写一个 Java 类实现一个接口:jarkata.servlet.Filter。并且实现这个接口当中的方法。

    • init方法:在Filter对象第一次被创建之后调用,并且只调用一次。(默认方法,可以不实现)
    • doFilter方法:只要用户发送一次请求,则执行一次。发送N次请求,则执行N次。在这个方法中编写过滤规则。(必须实现这个方法
      • 注意: chain.doFilter(request, response);这个代码是必须要写的,这行代码的作用是执行下一个过滤器或者执行目标Servlet的。如果不写那么就无法执行目标Servlet。
      • 在chain.doFilter(request, response); 前写的代码是在目标Servlet执行前执行的,在chain.doFilter(request, response); 后写的代码是在目标Servlet执行后执行的。
    • destroy方法:在Filter对象被释放/销毁之前调用,并且只调用一次。 (默认方法,可以不实现)
    public class LoginCheckFilter implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) servletRequest;HttpServletResponse response = (HttpServletResponse) servletResponse;//获取请求路径String servletPath = request.getServletPath();if(true){//在目标Servlet执行前执行的代码System.out.println("Servlet执行前......")filterChain.doFilter(request,response);//一定不能少的代码//在目标Servlet执行后执行的代码System.out.println("Servlet执行后......")} else {response.sendRedirect(request.getContextPath()); //返回网站的首页}}
    }
    
  • 第二步:在web.xml文件中对Filter进行配置。这个配置和Servlet很像。或者使用注解:@WebFilter({“*.do”})

    <filter><filter-name>filter2</filter-name><filter-class>com.gdb.javaweb.servlet.Filter2</filter-class>
    </filter>
    <filter-mapping><filter-name>filter2</filter-name><url-pattern>*.do</url-pattern>
    </filter-mapping>
    

2.Filter 中的细节

  • Filter的生命周期
    • 和Servlet对象生命周期一致。唯一的区别:Filter默认情况下,在服务器启动阶段就实例化。Servlet不会。
    • Servlet是单例的。Filter也是单例的。(单实例。)
  • 关于Filter的优先级
    • ① 注意:Filter的优先级,天生的就比Servlet优先级高。
      • 例如:/a.do 对应一个Filter,也对应一个Servlet。那么一定是先执行Filter,然后再执行Servlet。
    • ② 在web.xml文件中进行配置的时候,Filter的执行顺序:
      • 依靠filter-mapping标签的配置位置,越靠上优先级越高。过滤器的调用顺序,遵循栈数据结构。
    • ③ 使用@WebFilter的时候,Filter的执行顺序
      • 按照类名的字典序的顺序执行。
    • ④ 总结:在程序编译阶段不会确定Filter调用顺序。因为Filter的调用顺序是配置到web.xml文件中的,只要修改web.xml配置文件中filter-mapping的顺序就可以调整Filter的执行顺序。显然Filter的执行顺序是在程序运行阶段动态组合的。 这种设计模式被称为责任链设计模式。
  • 关于Filter的配置路径:
    • /a.do、/b.do、/dept/save。这些配置方式都是精确匹配。
    • /* 匹配所有路径。
    • *.do 后缀匹配。不要以 / 开始
    • /dept/* 前缀匹配。
  • 目标Servlet是否执行,取决于两个条件:
    • 第一:在过滤器当中是否编写了:chain.doFilter(request, response); 代码。
      • 执行下一个过滤器,如果下面没有过滤器了,执行最终的Servlet。
    • 第二:用户发送的请求路径是否和Servlet的请求路径一致。

3.Filter 总结

  • 过滤器是使用责任链设计模式实现的。
    • 责任链设计模式最大的核心思想:在程序运行阶段,动态的组合程序的调用顺序。
  • 可以使用过滤器来实现验证用户是否登录,防止未登录访问我们服务器中的数据

二、Listener(监听器)

  • 监听器是 Servlet 规范中的一员。就像 Filter 一样。Filter 也是 Servlet 规范中的一员。
  • 在 Servlet 中,所有的监听器接口都是以 “Listener” 结尾。
  • 注意:所有监听器中的方法都是不需要javaweb程序员调用的,当某个特殊的事件发生(特殊的事件发生其实就是某个时机到了。)之后,被web服务器自动调用。

1.Servlet规范中提供的监听器

  • jakarta.servlet包下:
    • ServletContextListener
    • ServletContextAttributeListener
    • 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、ServletRequestListener、HttpSessionListener 这三个监听器都提供了两个时间点,一个是域对象创建的时候,另一个是域对象销毁的时候。
  • ServletContextAttributeListener、ServletRequestAttributeListener、HttpSessionAttributeListener 这三个监听器都提供了三个时间点,一个是往域中添加数据的时候,一个是删除域中数据的时候,另一个是修改域中的数据的时候。

2…如何实现 Listener

  • 第一步:编写一个类实现 ServletContextListener 接口(以这个接口为例而已)。并且实现里面的方法。
    void contextInitialized(ServletContextEvent event)
    void contextDestroyed(ServletContextEvent event)
    
  • 第二步:在 web.xml 文件中对 ServletContextListener 进行配置。或者用注解 @WebListener。
    <listener><listener-class>com.bjpowernode.javaweb.listener.MyServletContextListener</listener-class>
    </listener>
    

3.Listener 应用场景

  • 请编写一个功能,记录该网站实时的在线用户的个数。
    • 我们可以通过服务器端有没有分配 session 对象,因为一个 session 代表了一个用户。有一个 session 就代表有一个用户。如果你采用这种逻辑去实现的话,session 有多少个,在线用户就有多少个。这种方式的话:HttpSessionListener 够用了。session 对象只要新建,则 count++,然后将 count 存储到 ServletContext 域当中,在页面展示在线人数即可。
  • 业务发生改变了,只统计登录的用户的在线数量,这个该怎么办?
    • session.setAttribute(“user”, userObj);
    • 用户登录的标志是 session 中曾经存储过 User 类型的对象。那么这个时候可以让 User 类型的对象实现 HttpSessionBindingListener 监听器,只要 User 类型对象存储到 session 域中,则 count++,然后将 count++ 存储到 ServletContext 对象中。页面展示在线人数即可。
    public class User implements HttpSessionBindingListener {private String username;private String password;//有参构造、无参构造、toString方法、set和get方法@Overridepublic void valueBound(HttpSessionBindingEvent event) {//用户登陆//User类型的对象向session中存储//获取ServletContextServletContext application = event.getSession().getServletContext();//获取在线人数Object onlineCount = application.getAttribute("onlineCount");if (onlineCount == null){application.setAttribute("onlineCount",1);}else {int count = (Integer)onlineCount;count++;application.setAttribute("onlineCount",count);}}@Overridepublic void valueUnbound(HttpSessionBindingEvent event) {//退出登陆//User类型的对象从session域中删除//获取ServletContextServletContext application = event.getSession().getServletContext();//获取在线人数Integer onlineCount = (Integer) application.getAttribute("onlineCount");onlineCount--;application.setAttribute("onlineCount",onlineCount);}
    

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

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

相关文章

最小二乘圆柱拟合(高斯牛顿法)

欢迎关注更多精彩 关注我&#xff0c;学习常用算法与数据结构&#xff0c;一题多解&#xff0c;降维打击。 本期话题&#xff1a;最小二乘圆柱拟合 相关背景资料 点击前往 圆柱拟合输入和输出要求 输入 8到50个点&#xff0c;全部采样自圆柱上。每个点3个坐标&#xff0c;坐…

自动化测试的10大误区!

自动化测试因提高效率&#xff0c;减少重复工作的特性而被广泛采用。然而&#xff0c;随着自动化测试的普及&#xff0c;自动化测试也面临一系列挑战和误解。 这些误区不仅影响了测试的有效性&#xff0c;还会导致一定的项目风险&#xff0c;为了确保自动化测试能够真正提升测…

【EI会议征稿通知】2024年第四届激光,光学和光电子技术国际学术会议(LOPET 2024)

2024年第四届激光&#xff0c;光学和光电子技术国际学术会议(LOPET 2024) 2024 4th International Conference on Laser, Optics and Optoelectronic Technology 2024年第四届激光&#xff0c;光学和光电子技术国际学术会议(LOPET 2024)将于2024年5月17日-19日在中国重庆举行。…

长度最小的子数组[中等]

一、题目 给定一个含有n个正整数的数组和一个正整数target。找出该数组中满足其总和大于等于target的长度最小的连续子数组[numsl, numsl1, ..., numsr-1, numsr]&#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回0。 示例 1&#xff1a; 输入&#xff…

迷你型洗衣机好用吗?迷你内裤洗衣机排名前十名推荐

随着大家工作的压力越来越大&#xff0c;下了班之后只能想躺平&#xff0c;在洗完澡之后看着还需要手洗的内衣裤真的很头疼。有些小伙伴还有会攒几天再丢进去洗衣机里面一起&#xff0c;而且这样子是非常不好的&#xff0c;用过的内衣裤长时间不清洗容易滋生细菌&#xff0c;而…

Redis学习——高级篇④

Redis学习——高级篇④ Redis7高级之Redis与Mysql数据双写一致性工程案例&#xff08;四&#xff09; 4.1 MySQL主从复制原理4.2 canal 工作原理4.3 mySQL->canal->redis 双写一致性1.环境2.配置Mysql3.配置canal4. Canal客户端&#xff08;Java编写&#xff0…

JavaScript-for循环的执行顺序

1.目标 掌握for执行顺序 2.实现思路 使用for循环输出0-到5 3.代码实现 Document 4.总结 for执行顺序 1.执行 var i 0 变量初始化 条件判断 是否成立 成立 执行循环体 不成立 退出for循环

STL_list

一、有关list的介绍 list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向其前一个元素和后一个元素。Ii…

Docker容器引擎(6)

目录 一.什么是consul 解决什么问题&#xff1f; consul的模式&#xff1a; 二.consul 部署 consul服务器&#xff1a; 查看版本&#xff1a; 设置代理&#xff0c;在后台启动 consul 服务端&#xff1a; 进行后台启动&#xff1a; 查看集群信息&#xff1a; 访问页面…

云计算底层技术奥秘、磁盘技术揭秘、虚拟化管理、公有云概述

云计算基础 实验图例 虚拟化平台安装 创建虚拟机 1、创建虚拟机 2cpu&#xff0c;4G内存&#xff08;默认用户名: root 密码: a&#xff09; 2、验证 ecs 是否支持虚拟化 [rootecs ~]# grep -Po "vmx|svm" /proc/cpuinfovmx... ...[rootecs ~]# lsmod |grep kvm…

【算法专题】前缀和(附图解、代码)

&#x1f4d1;前言 本文主要是前缀和的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x1f304;每日一句&#xff1a;努力一点&…

Orion-14B-Chat-Plugin本地部署的解决方案

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

WebSocket 整合 记录用法

WebSocket 介绍 WebSocket 是基于tcp的一种新的网络协议,可以让浏览器 和 服务器进行通信,然后区别于http需要三次握手,websocket只用一次握手,就可以创建持久性的连接,并进行双向数据传输 Http和WebSocket的区别 Http是短连接,WebSocket’是长连接Http通信是单向的,基于请求…

互联网加竞赛 基于深度学习的人脸表情识别

文章目录 0 前言1 技术介绍1.1 技术概括1.2 目前表情识别实现技术 2 实现效果3 深度学习表情识别实现过程3.1 网络架构3.2 数据3.3 实现流程3.4 部分实现代码 4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的人脸表情识别 该项目较…

HiveSQL题——排序函数(row_number/rank/dense_rank)

一、窗口函数的知识点 1.1 窗户函数的定义 窗口函数可以拆分为【窗口函数】。窗口函数官网指路&#xff1a; LanguageManual WindowingAndAnalytics - Apache Hive - Apache Software Foundationhttps://cwiki.apache.org/confluence/display/Hive/LanguageManual%20Windowin…

【Algorithms 4】算法(第4版)学习笔记 01 - 1.5 案例研究:union-find算法

文章目录 前言参考目录学习笔记1&#xff1a;动态连通性2&#xff1a;UF 实现 1&#xff1a;快速查找 quick-find2.1&#xff1a;demo 演示 12.2&#xff1a;demo 演示 22.3&#xff1a;quick-find 代码实现3&#xff1a;UF 实现 2&#xff1a;快速合并 quick-union3.1&#xf…

【Java 数据结构】二叉树

二叉树 1. 树型结构&#xff08;了解&#xff09;1.1 概念1.2 概念&#xff08;重要&#xff09;1.3 树的表示形式&#xff08;了解&#xff09;1.4 树的应用 2. 二叉树&#xff08;重点&#xff09;2.1 概念2.2 两种特殊的二叉树2.3 二叉树的性质2.4 二叉树的存储2.5 二叉树的…

【人工智能课程】计算机科学博士作业二

使用TensorFlow1.x版本来实现手势识别任务中&#xff0c;并用图像增强的方式改进&#xff0c;基准训练准确率0.92&#xff0c;测试准确率0.77&#xff0c;改进后&#xff0c;训练准确率0.97&#xff0c;测试准确率0.88。 1 导入包 import math import warnings warnings.filt…

SpringBoot---创建项目

介绍 此项目SpringBoot使用的是2.6.1版本&#xff0c;由于这个项目使用的是maven聚合方式创建的&#xff0c;所以第二步是我在聚合方式下需要添加的依赖&#xff0c;完整的pom.xml内容放到了最下面。 第一步&#xff1a;创建Maven项目 这个里什么也不勾选&#xff0c;直接点…

JDK Locale的妙用:探索多语言和地区设置的强大功能

文章目录 前言应用场景国际化&#xff08;Internationalization&#xff09;格式化&#xff08;Formatting&#xff09;日期格式化数字格式化金额格式化百分比形式格式化 获取Locale信息 前言 JDK&#xff08;Java Development Kit&#xff09;的Locale类用于表示特定的地理、…