过滤器Filter

news/2024/5/19 19:43:38/

文章目录

  • 1. Listener监听器
    • 监听器Listener文档说明
    • 1.1 ServletContextListener监听器
    • 1.2 ServletContextAttributeListener监听器
    • 1.3 HttpSessionListener监听器
    • 1.4 HttpSessionAttributeListener监听器
    • 1.5 ServletRequestListener监听器
    • 1.6 其它监听器
      • 1.6.1 ServletRequestAttributeListener
      • 1.6.2 HttpSessionBindingListener
      • 1.6.3 HttpSessionActivationListener
  • 2. Filter过滤器
    • 2.1 过滤器说明
    • 2.2 过滤器基本原理
    • 2.3 过滤器分析和实例
    • 2.4 url-pattern
    • 2.5 Filter生命周期
    • 2.6 FilterConfig
    • 2.7 FilterConfig应用实例
    • 2.8 过滤器链基本原理分析
      • 2.8.1 过滤链实例演示
      • 2.8.2 过滤链注意事项
    • 2.9 过滤器作业布置

1. Listener监听器

  1. Listener监听器是JavaWeb三大组件之一, JavaWeb三大组件分别是: Servlet程序, Listener监听器, Filter过滤器
  2. Listener是JavaEE的规范, 就是接口
  3. 监听器的作用是, 监听某种变化(一般就是 对象创建/销毁, 属性变化), 触发对应方法完成相应的任务
  4. JavaWeb中的监听器共八个, 目前最常用的是ServletContextListener

监听器Listener文档说明

  1. ServletContextListener(Interface), 用来感知ServletContext对象的创建和销毁
    在这里插入图片描述
  2. ServletContextAttributeListener(Interface), 用来感知ServletContext对象属性的变化
    在这里插入图片描述
  3. ServletRequestListener(Interface), 用来监听和感知ServletRequest对象的创建和销毁在这里插入图片描述
  4. ServletRequestAttributeListener(Interface), 用来感知ServletRequest对象属性的变化
    在这里插入图片描述
  5. HttpSessionListener(Interface), 用来监听HttpSession对象的创建和销毁
    在这里插入图片描述
  6. HttpSessionAttributeListener(Interface), 用来监听HttpSession对象属性的变化
    在这里插入图片描述
  7. HttpSessionBindingListener(Interface)(感知监听器), 将一个数据绑定到Session, 用来一对一的监听
    在这里插入图片描述
  8. HttpSessionActivationListener(Interface), 用来监听Session绑定的对象钝化或者激活的时间
    钝化: 把Session绑定的对象持久化到磁盘
    激活: 重新读回来再放到Session空间
    在这里插入图片描述

1.1 ServletContextListener监听器

  1. 作用: 监听ServletContext创建或销毁(当我们Web应用启动时, 就会创建ServletContext), 即生命周期监听. 应用场景: (1) 加载初始化的配置文件; (2) 任务调度(配合定时器Timer/TimerTask)
  2. 相关方法

void contextInitialized(ServletContextEvent sce) 创建ServletContext时触发
contextDestroyed(ServletContextEvent sce) 销毁ServletContext时触发

  1. 应用实例
  1. 新建java项目
    在这里插入图片描述
    在这里插入图片描述
  2. 导入Web框架
    在这里插入图片描述
    在这里插入图片描述
  3. 引入Servlet-pai.jar包
    在这里插入图片描述
    在这里插入图片描述
  4. 配置Tomcat
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  5. 新建一个java类
    在这里插入图片描述
  6. 实现监听器接口
    在这里插入图片描述
    在这里插入图片描述
  7. 业务处理
    在这里插入图片描述
  8. 配置web.xml
    在这里插入图片描述
  9. 运行结果
    在这里插入图片描述

1.2 ServletContextAttributeListener监听器

  1. 作用: 监听ServletContext的属性变化
  2. 相关方法

void attributeAdded(ServletContextAttributeEvent event)添加属性时调用
void attributeReplaced(ServletContextAttributeEvent event)替换属性时调用
void attributeRemoved( ServletContextAttributeEvent event)移除属性时调用

  1. 应用实例
  1. 新建java类, 实现监听器接口
    在这里插入图片描述
  2. 处理业务
    在这里插入图片描述
    创建并配置HiServlet, 书写业务逻辑中…
    在这里插入图片描述
  3. 配置web.xml
    在这里插入图片描述
  4. 运行结果
    项目启动时, ServletContext会添加三个默认对象, 被ZzwServletContextAttributeListener 监听到
    在这里插入图片描述
    访问hiServlet
    在这里插入图片描述

1.3 HttpSessionListener监听器

  1. 作用: 监听Session创建或销毁, 即生命周期监听(可用于监护用户上线, 离线)
  2. 相关方法

void sessionCreated(HttpSessionEvent se) 创建session时调用
sessionDestroyed(HttpSessionEvent se)销毁session时调用

  1. 应用实例
  1. 新建java类, 实现监听器接口
    功能: 监听session的创建和销毁. 监听到有session创建时, 给该session的生命周期设置为30s
    在这里插入图片描述
    改进后(用于监护用户上线, 离线)
    在这里插入图片描述
  2. 配置web.xml
    在这里插入图片描述
  3. 运行结果
    分析: 项目启动后, 会默认进入首页面, 这时会创建两个和系统相关的session, 30s过后, 这两个session被销毁, 被监听器监听到. 或者(如果不想看到它, 清一下控制台点击重新发布, 就没有了)
    在这里插入图片描述

1.4 HttpSessionAttributeListener监听器

  1. 作用: 监听Session属性的变化
  2. 相关方法

void attributeAdded(ServletRequestAttributeEvent srae) 添加属性时调用
void attributeReplaced(ServletRequestAttributeEvent srae) 替换属性时调用
void attributeRemoved(ServletRequestAttributeEvent srae) 移除属性时调用

  1. 应用实例
  1. 创建并实现监听器
    在这里插入图片描述
  2. 配置web.xml
    在这里插入图片描述
  3. 配置Servlet
    在这里插入图片描述
  4. 运行结果
    在这里插入图片描述
    在这里插入图片描述

1.5 ServletRequestListener监听器

  1. 作用: 监听Request创建或销毁, 即Request生命周期监听
  2. 相关方法

void requestInitialized(ServletRequestEvent sre) 创建request时触发
void requestDestroyed(ServletRequestEvent sre) 销毁request时触发

  1. 可以用来监控某个IP访问我们网站的频率, 记录日志, 访问资源的情况
  1. 实现监听器
    在这里插入图片描述
  2. 配置web.xml
    在这里插入图片描述
  3. 运行结果
    在这里插入图片描述

1.6 其它监听器

1.6.1 ServletRequestAttributeListener

1.6.2 HttpSessionBindingListener

1.6.3 HttpSessionActivationListener

2. Filter过滤器

在这里插入图片描述

2.1 过滤器说明

在这里插入图片描述

  • 过滤器说明
  1. Filter 过滤器是JavaWeb三大组件之一(Servletcx, Listener监听器, Filter过滤器)
  2. Filter 过滤器是JavaEE的规范, 是接口
    在这里插入图片描述
  3. Filter 过滤器它的作用是: 拦截请求, 过滤响应
  4. 应用场景
  • 权限检查
  • 日记操作
  • 事务管理

2.2 过滤器基本原理

在这里插入图片描述

  1. 先画图, 清晰思路 => 2. 走代码
    在这里插入图片描述

2.3 过滤器分析和实例

  1. 先完成一个正确的流程, 看到一个效果 -> 写后面代码就可以验证
  2. 加入其它的功能[1.加入session, 验证合法性]
  1. 创建java项目
    在这里插入图片描述
  2. 添加Framework框架
    在这里插入图片描述在这里插入图片描述
  3. 添加jar包
    在这里插入图片描述
  4. 配置Tomcat
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  5. 先完成一个正确的流程, 同时添加session, 验证合法性
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  6. 配置Filter过滤器
    在这里插入图片描述
    在这里插入图片描述
  7. doFilter()方法
    请求转发的内容并不经过过滤器
    tips: 请求转发的内容并不经过过滤器
    如果从login.jsp登录经过LoginCheckServlet请求转发到/manage/admin.jsp页面, 只会调用一次doFilter)(方法, 因为请求转发并不会经过过滤器(即使路径匹配), 但是admin.jsp页面内的图片资源会让浏览器发送获取图片资源的请求, 这是会经过过滤器
    tips: 如何判断doFilter()中的servletRequest和admin.jsp中的request内置对象是同一个对象
    实验设计: 在login页面登录成功后, 直接在地址栏访问admin.jsp页面, 这样即会走过滤器, 又会访问admin.jsp
    在这里插入图片描述
    在这里插入图片描述
    实验结果:
    在这里插入图片描述
    tips:
    在这里插入图片描述
    在这里插入图片描述

2.4 url-pattern

  1. url-pattern: Filter的拦截路径, 即浏览器在请求什么位置的资源时, 过滤器会进行拦截过滤
  2. 精确匹配 /a.jsp对应的 请求地址http://ip[域名]:port/工程路径/a.jsp会拦截
  3. 目录匹配 /manage/*对应的 请求地址http://ip[域名]:port/工程路径/manage/xx, 即web工程manage目录下所有资源 均会拦截
  4. 后缀名匹配 *.jsp(后缀名可变, 比如*.action *.do)对应的 请求地址http://ip[域名]:port/工程路径/xx.jsp, 后缀名为.jsp的请求均会被拦截

tips: 不能这么配, 这么配即使用户登陆成功也会被拦截
在这里插入图片描述

  1. Filter过滤器它只关心请求的地址是否匹配, 不关心请求的资源是否存在
  1. 在未登陆的情况下, 请求http://localhost:8085/filter/manage/xxx, 会被拦截器拦截到进入登录页面
    在这里插入图片描述
    在这里插入图片描述
  2. 登录成功后再次访问http://localhost:8085/filter/manage/xxx, 拦截器放行, 请求不到该资源, 将返回404
    在这里插入图片描述
    在这里插入图片描述

2.5 Filter生命周期

在这里插入图片描述
在这里插入图片描述
不同的浏览器调用这个filter, 次数会叠加
在这里插入图片描述

2.6 FilterConfig

在这里插入图片描述

  • FilterConfig说明
  1. FilterConfig是Filter过滤器的配置类
  2. Tomcat每次创建Filter的时候, 也会创建一个FilterConfig对象, 这里包含了Filter配置文件的配置信息
  3. FilterConfig对象作用是获取filter过滤器的配置内容
  1. 新建ZzwFilterConfig类
    在这里插入图片描述
    在这里插入图片描述
  2. 配置web.xml
    在这里插入图片描述

2.7 FilterConfig应用实例

  1. 拦截网段0:0:0:0:0:0:0:1
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    0:0:0:0:0:0:0:1是ipv6的表现形式,对应ipv4来说相当于127.0.0.1,也就是本机。
    在这里插入图片描述

2.8 过滤器链基本原理分析

在处理某些复杂业务的时候, 一个过滤器往往不够, 可以设计多个过滤器共同完成任务, 形成过滤器链
在这里插入图片描述

2.8.1 过滤链实例演示


  1. 在这里插入图片描述
  2. AFilter.class, BFilter.class
    在这里插入图片描述
  3. 配置过滤器
    在这里插入图片描述
  4. 运行结果
    在这里插入图片描述
    在这里插入图片描述

2.8.2 过滤链注意事项

  1. 多个filter和目标资源在一次http请求中, 同时在一个线程中

实验设计
在这里插入图片描述
在这里插入图片描述
请求两次
在这里插入图片描述
实验结果
在这里插入图片描述

  1. 当一个请求的url和filter的url-pattern匹配时, 才会被执行, 如果有多个匹配上, 就会顺序执行, 形成一个filter调用链(底层可以使用一个数据结构搞定)
  2. 多个filter共同执行时, 因为是一次http请求, 所以使用同一个request对象
  3. 多个filter执行顺序, 和web.xml配置顺序保持一致
  4. chain.doFilter(servletReuqest, servletResponse), 即执行下一个过滤器的doFilter方法, 如果后面没有过滤器, 则执行目标资源
  5. 小结: 注意执行过滤器链时, 顺序是: Http请求->A过滤器doFilter()方法->A过滤器前置代码->A过滤器chain.doFilter()->B过滤器doFilter()方法->B过滤器前置代码->B过滤器chain.doFilter()->目标资源->B过滤器后置代码->A过滤器后置代码->返回给浏览器数据

2.9 过滤器作业布置

在这里插入图片描述

  1. topic.jsp
    在这里插入图片描述
  2. showTopic.jsp
    在这里插入图片描述
  3. TopicFilter.jsp
    在这里插入图片描述
    web.xml配置
    在这里插入图片描述
  4. 运行结果
    在这里插入图片描述
    在这里插入图片描述
  5. 目录结构
    在这里插入图片描述

http://www.ppmy.cn/news/47085.html

相关文章

QS排名十年对比:美国大学最稳,中国大学进步最快

QS世界大学排名发布距今已有20年历史,迄今为止,全球已有超过90个国家和地区共1500多所大学进入QS世界排名。QS排名评估中所使用的5项评估标准基本保持不变。 QS使用5个关键指标来进行排名,包括学术声誉、雇主声誉、篇均论文引用、H指数和国际…

at单一次任务,crontab周期性任务 rhce(21)

目录 1.atd和crond两个任务管理程序的区别 2.指定在2023/08/26 09:00将时间写入testmail.txt文件中 3.指定在每天凌晨4:00将该时间点之前的系统日志信息备份到个目录下(/var/log/messages),备份后日志文件名显示格式logfileYY-MM-DD HH-MM…

.class文件在线转成.java文件方法

使用背景: 工作中碰到老的项目就头疼,有些连源码都没有,解决bug只能从class文件反编译成java后,来读懂业务逻辑。 后来在网上找了一些工具来帮助class文件转码,有些遇到lamda表达式就转换错误,有些使用起…

torch.empty的作用:返回一个未初始化的Tensor

在官网查到torch.empty()的初始格式是empty(*size, *, outNone, dtypeNone, layouttorch.strided, deviceNone, requires_gradFalse, pin_memoryFalse, memory_formattorch.contiguous_format) -> Tensor。 返回一个充满未初始化数据的张量。张量的形状是由变量参数定义:att…

会话跟踪技术

目录 Cookie基本使用 Cookie原理 Cookie使用细节 Session基本使用 Session原理 Session使用细节 案例 用户登录注册案例 用户注册功能 保存用户信息到数据库 验证码-展示 验证码-校验 会话跟踪技术的概述 会话:用户打开浏览器,访问web服务器的资源&…

HelloWorld案例详解

HelloWorld案例的编写和执行 Java程序开发运行流程 开发Java程序,需要三个步骤: ●编写代码 ●编译代码 ●运行代码 HelloWorld案例的编写 新建文本文档文件,修改名称为HelloWorld.java用记事本打开HelloWorld.java文件,输写…

数据结构之顺序表,实现顺序表的增删改查

目录 一、顺序表的概念 二、顺序表的分类 1.静态顺序表 2.动态顺序表 3.顺序表的增删改查 总结 一、顺序表的概念 顺序表是一段物理地址连续的村塾单元依次存储数据元素的线性结构,一般情况下使用数组存储,在数组上完成数据的增删改查。 二、顺…

LeetCode每日一题 1023. 驼峰式匹配 --双指针

Halo,这里是Ppeua。平时主要更新C语言,C,数据结构算法......感兴趣就关注我吧!你定不会失望。 🌈个人主页:主页链接 🌈算法专栏:专栏链接 我会一直往里填充内容哒! &…

Redis:常见的面试题和答案

1、Redis 是什么?它的主要用途是什么? 答案: Redis 是一个开源的内存数据结构存储系统,可以用作数据库、缓存和消息代理。它支持多种数据结构,例如字符串、列表、哈希表、集合和有序集合。Redis 的主要用途包括缓存、会话存储、排…

并发数据结构的目的和设计指南理解学习

并发数据结构的目的: 1、设计并发数据结构是为了让多线程并发访问,并且线程可对数据结构做相同或不同的操作。 2、多线程环境下, 无数据丢失和损毁,所有的数据需要维持原样,且无条件竞争的数据结构; 3、…

【Python基础入门学习】Python工具Pycharm的安装与使用

一、关于Python 1.1 下载Python 在下载与安装pycharm工具前,一定要先安装python 打开Python官网:python下载打开上述网站,选择 Downloads -> 系统 我是Windows系统,点击进入后,找到自己要安装的安装包以及想安装的…

LCMXO3LF-4300C-6BG324I FPGA lattice 深力科 FPGA的基本结构

LCMXO3LF-4300C-6BG324I FPGA lattice 深力科 FPGA的基本结构 lattice莱迪斯深力科电子 超低密度FPGA 是最新的立即启用、非挥发性、小型覆盖区 FPGA,采用先进的封装技术,能让每个元件达到最低成本。此系列采用最新的小型封装,不仅具有低功率…

【Linux】git命令(基础,新手)

文章目录 1.查看当前git版本信息2.安装git3.将远端仓库克隆到本地4.三板斧第一招:git add5.三板斧第二招:git commit6.三板斧第三招:git push7.对仓库文件进行更改8.查看使用提交日志9.查看本地与远端的同步状态10.从远端仓库拉取最新版本文件…

【智能电网】智能电网中针对DOS和FDIA的弹性分布式EMA(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

IP-GUARD能否实现打印指定文件时需经过管理员审批后才能打印?

支持。先设置禁止打印文档的策略,然后设置相关审批流程,再给到客户端相应的申请权限: 1、在控制台-高级-打印控制策略中,给需要进行打印管控的客户端设置以下策略: 动作:禁止 2、在控制台-申请管理-桌面申请管理-审批流程管理中,添加申请类型为打印的审批流程,指定审批人…

Linux 内核调优部分参数说明

表示尽量使用内存,减少使用磁盘 swap 交换分区,内存速度明显高于磁盘一个数量级。 vm.swappiness 0内存分配策略,Redis 持久化存储需设置值为1。 vm.overcommit_memory 10:表示内核将检查是否有足够的可用内存供应用进程使用&…

「C/C++」C语言与C++的区别

目录 1. 语言起源2. 编程范式3. 內置类4. 函数重载5. 引用类型6. 模板7. 异常处理 1. 语言起源 C语言 最初是由Dennis Ritchie在1970年代开发的,它是一种可移植、高效、底层的编程语言,主要用于系统软件、嵌入式开发、操作系统等领域。 C语言 于1980年代…

我的创作纪念日:Unity CEO表示生成式AI将是Unity近期发展重点,发布神秘影片预告

PICK 未来的AI技术将会让人类迎来下一个生产力变革,这其中也包括生成型AI的突破性革新。各大公司也正在竞相推出AIGC工具,其中微软的Copilot、Adobe的Firefly、Github的chatGPT等引起了人们的关注。然而,游戏开发领域似乎还没有一款真正针对性…

nacos使用

【应用服务注册】 1,引入依赖 spring-cloud-starter-alibaba-nacos-discovery 2,配置服务地址 spring.cloud.nacos.discovery.server-addr:0.0.0.0:8848/ 3,启动类添加注解 EnableDiscoveryClient 4,统一接口返回结构 ResultData …

ubuntu(20.04)-shell脚本(2)echo-date-awk-sed-iptables-shell变量数组

1.echo 语法:echo [-ne][字符串]补充说明: 1、echo会将输入的字符串送往标准输出。 2、输出的字符串间以空白字符隔开,并在最后加上换行号。OPTIONS: -n 不要在最后自动换行 -e 若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文…