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.rhkb.cn/news/247995.html

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

相关文章

1002. HarmonyOS 开发问题:鸿蒙 OS 技术特性是什么?

1002. HarmonyOS 开发问题&#xff1a;鸿蒙 OS 技术特性是什么? 硬件互助&#xff0c;资源共享 分布式软总线 分布式软总线是多种终端设备的统一基座&#xff0c;为设备之间的互联互通提供了统一的分布式通信能力&#xff0c;能够快速发现并连接设备&#xff0c;高效地分发…

方案:将vue项目放在SpringMVC中,并用tomcat访问

需要先将项目生成一次war包才能访问项目的webapp文件夹下的资源&#xff0c;否则tomcat的webapp文件夹下面不会生成对应资源文件夹就无法访问。 问题&#xff1a;目录如下&#xff1a; 今天我测试了一下将vue打包后&#xff0c;放入webapp下面访问&#xff0c;却发现vue项目无…

关于Spring Boot和MyBatis常见的十道面试题

拦截器和过滤器有什么区别&#xff1f; 拦截器&#xff08;Interceptor&#xff09;和过滤器&#xff08;Filter&#xff09;都是用于在请求道道目标资源的之前或之后进行处理的组件。主要区别有以下几点&#xff1a; 依赖对象不同&#xff1a;过滤器是来时Servlet&#xff0…

备战蓝桥杯--数据结构及STL应用(基础)

今天轻松一点&#xff0c;讲一讲stl的基本操作吧&#xff01; 首先&#xff0c;让我们一起创建一个vector容器吧&#xff01; #include<bits/stdc.h> using namespace std; struct cocoack{ int coco,ck; } void solve(){vector<cocoack> x;for(int i0;i<5;i){…

私有化部署pdf工具箱

功能简介 用于合并/拆分/旋转/移动PDF及其页面的完全交互式GUI。 将多个 PDF 合并到一个生成的文件中。 将 PDF 拆分为多个文件&#xff0c;并按指定的页码或将所有页面提取为单个文件。 将 PDF 页面重新组织为不同的顺序。 以 90 度为增量旋转 PDF。 删除页面。 多页布局…

《HTML 简易速速上手小册》第7章:HTML 多媒体与嵌入内容(2024 最新版)

文章目录 7.1 在HTML中嵌入视频和音频7.1.1 基础知识7.1.2 案例 1&#xff1a;嵌入视频文件7.1.3 案例 2&#xff1a;嵌入音频文件7.1.4 案例 3&#xff1a;创建一个视频和音频混合的播放列表 7.2 使用 <iframe> 嵌入外部内容7.2.1 基础知识7.2.2 案例 1&#xff1a;嵌入…

超越传统—Clean架构打造现代Android架构指南

超越传统—Clean架构打造现代Android架构指南 1. 引言 在过去几年里&#xff0c;Android应用开发经历了巨大的变革和发展。随着移动设备的普及和用户对应用的期望不断提高&#xff0c;开发人员面临着更多的挑战和需求。传统的Android架构在应对这些挑战和需求时显得有些力不从…

除了Adobe之外,还有什么方法可以将Excel转为PDF?

前言 Java是一种广泛使用的编程语言&#xff0c;它在企业级应用开发中发挥着重要作用。而在实际的开发过程中&#xff0c;我们常常需要处理各种数据格式转换的需求。今天小编为大家介绍下如何使用葡萄城公司的的Java API 组件GrapeCity Documents for Excel&#xff08;以下简…

Docker 安装篇(CentOS)

Docker社区版 Docker从1.13版本之后采用时间线的方式作为版本号&#xff0c;分为社区版CE和企业版EE。 社区版是免费提供给个人开发者和小型团体使用的&#xff0c;企业版会提供额外的收费服务&#xff0c;比如经过官方测试认证过的基础设施、容器、插件等。 1、Docker 要求 C…

研发日记,Matlab/Simulink避坑指南(五)——CAN解包 DLC Bug

文章目录 前言 背景介绍 问题描述 分析排查 解决方案 总结 前言 见《研发日记&#xff0c;Matlab/Simulink避坑指南&#xff08;一&#xff09;——Data Store Memory模块执行时序Bug》 见《研发日记&#xff0c;Matlab/Simulink避坑指南(二)——非对称数据溢出Bug》 见《…

Activity创建与跳转

快捷&#xff0c;一下创建三个 跳转

《HTML 简易速速上手小册》第1章:HTML 入门(2024 最新版)

文章目录 1.1 HTML 简介与历史&#xff08;&#x1f609;&#x1f310;&#x1f47d;踏上神奇的网页编程之旅&#xff09;1.1.1 从过去到现在的华丽蜕变1.1.2 市场需求 —— HTML的黄金时代1.1.3 企业中的实际应用 —— 不只是个网页1.1.4 职业前景 —— 未来属于你 1.2 基本 H…

文献速递:人工智能医学影像分割--- 深度学习分割骨盆骨骼:大规模CT数据集和基线模型

文献速递&#xff1a;人工智能医学影像分割— 深度学习分割骨盆骨骼&#xff1a;大规模CT数据集和基线模型 我们为大家带来人工智能技术在医学影像分割上的应用文献。 人工智能在医学影像分析中发挥着至关重要的作用&#xff0c;尤其体现在图像分割技术上。这项技术的目的是准…

Django配置websocket时的错误解决

基于移动群智感知的网络图谱构建系统需要手机app不断上传数据到服务器并把数据推到前端标记在百度地图上&#xff0c;由于众多手机向同一服务器发送数据&#xff0c;如果使用长轮询&#xff0c;则实时性差、延迟高且服务器的负载过大&#xff0c;而使用websocket则有更好的性能…

iOS 17.4 苹果公司正在加倍投入人工智能

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

组件冲突、data函数、组件通信

文章目录 1.组件的三大组成部分 - 注意点说明2.组件的样式冲突&#xff08;用 scoped 解决&#xff09;3.data是一个函数4.组件通信1.什么是组件通信&#xff1f;2.不同的组件关系 和 组件通信方案分类 5.prop详解prop 校验①类型校验②完整写法&#xff08;类型&#xff0c;非…

Windows系统安装OpenSSH+VS Code结合内网穿透实现远程开发

文章目录 前言1、安装OpenSSH2、vscode配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar内网穿透4.2 创建隧道映射4.3 测试公网远程连接 5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网地址远程 前言 远程…

计算机毕业设计 | SpringBoot 求职招聘管理系统(附源码)

1&#xff0c;绪论 1.1 开发背景 高学历人群是网络求职者的主体&#xff0c;且结构趋向固定。而在疫情肆虐的今日&#xff0c;线上招聘成了越来越多企业和个人选择的方式。在疫情期间线下招聘转为线上招聘&#xff0c;是疫情防控的需要。不能否定的是新的招聘模式的出现一定会…

IS-IS:04 DIS

IS-IS 协议只支持两种网络类型&#xff0c;即广播网络和点到点网络。与 OSPF 协议相同&#xff0c; IS-IS 协议在广播网络中会将网络视为一个伪节点 &#xff08; Pesudonde&#xff0c;简称 PSN&#xff09;&#xff0c;并选举出一台DIS &#xff08;Designated IS&#xff09…

【SVD生成视频+可本地部署】ComfyUI使用(二)——使用Stable Video Diffusion生成视频 (2023.11开源)

SVD官方主页 &#xff1a; Huggingface | | Stability.ai || 论文地址 huggingface在线运行demo : https://huggingface.co/spaces/multimodalart/stable-video-diffusion SVD开源代码&#xff1a;Github&#xff08;含其他项目&#xff09; || Huggingface 在Comfyui使用&…