过滤器Filter

news/2024/12/21 21:58:30/

文章目录

  • 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,数据结构算法......感兴趣就关注我吧!你定不会失望。 🌈个人主页:主页链接 🌈算法专栏:专栏链接 我会一直往里填充内容哒! &…