【JavaEE-Servlet】Filter过滤器详解

news2024/11/18 1:33:48

Filter过滤器

  • 熟悉的关键字-Filter(回顾-联系-可以不看)
  • Filter概述
  • 何时使用?
  • Filter生命周期
  • 过滤器单个实现
    • doFilter方法
  • 关于Filter的配置路径
  • Filter的执行顺序
    • 在`web.xml`文件中进行配置的时候,`Filter`的执行顺序是什么?
    • 使用WebFilter注解配置时,Filter的执行顺序是什么?
    • 过滤器的调用顺序
  • 职责链设计模式
  • Filter运用

熟悉的关键字-Filter(回顾-联系-可以不看)

filter这个关键字在JavaSEjdk1.8新特性stream流中的方法中是出现过:

Stream filter(Predicate<? super T> predicate); 

这个方法返回一个子集流,过滤掉不满足条件的数据,返回符合条件的数据,非终端方法

通过它可以直观的猜测这个关键字是和过滤数据有关系的。

Filter概述

  • Filter是过滤器;
  • FilterServlet高级特性之一,实际就是实现Filter接口的Java类,主要还是Java程序;
  • 可以把Servlet程序看作是一个最终要执行的目标,可以使用过滤器Filter来添加过滤代码,这个过滤代码可以添加到Servlet执行之前,也可以添加到Servlet执行之后,Filter可以做到在Servlet这个目标程序执行之前过滤,也可以在目标程序执行之后过滤;
  • 一般情况下,都是在过滤器当中编写公共代码;
  • Filter之前发送请求访问Servlet

在这里插入图片描述
(可以看到三个Servlet都写了判断登录的代码,代码重复写,没有达到代码复用的效果)

  • Filter之后发送请求访问Servlet可以是以下这样的:

在这里插入图片描述

(经不经过过滤器看路径,先走过滤器再去寻资源,一个项目里面可以有多个过滤器,一个请求也可能经过多个过滤器再到所需资源)

过滤器在WEB容器中哪里?

在这里插入图片描述

何时使用?

只能说Filter过滤器功能很强大!!!

  • 需要限制用户访问某些资源时;
  • 需要处理请求时先处理某些资源时;
  • 需要对服务器响应的内容处理后再响应时。

Filter生命周期

和Servlet生命周期一致。

唯一的区别:Filter默认情况下,在服务器启动阶段就实例化,而Servlet不会,Servlet是默认根据请求来的。

过滤器单个实现

  1. 编写一个Java类实现一个接口:Jakarta.servlet.Filter,并且实现这个接口当中的所有方法;

init方法:在Filter对象第一次被创建之后调用,并且只调用一次;(默认方法)
doFilter方法:只要用户发送一次请求,则执行一次;
destroy方法:在Filter对象被释放/销毁之前调用,并且只调用一次。(默认方法)

如果initdestroy方法没有特殊使用,子类可以不重写,它们俩是默认方法;Filter可以称为函数式接口!

doFilter方法

三个方法中一个doFilter方法是特殊的,(其他俩个和Servlet中是一致的)。

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException

doFilter前俩参数是ServletRequestServletResponse对象,可以看到这是面向接口编程,可以实现任何协议的过滤操作!!!
第三个参数FilterChainServlet中没有的。
在这里插入图片描述

  • FilterChain接口是由WEB容器实现的,我们只管使用即可!!!

下面是使用描述:
在这里插入图片描述

  1. web.xml文件中对Filter进行配置或者利用注解(@WebFilter)进行配置,这个配置和Servlet很像;

注意:Servlet对象默认情况下,在服务器启动的时候是不会新建对象的,Filter对象默认情况下,在服务器启动的时候新建对象。另外Servlet是单例的,Filter也是单例的!!!

在这里插入图片描述

在这里插入图片描述

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

  • 第一:在过滤器当中是否编写了:chain.doFilter(request,response);代码;
  • 第二:用户发送的请求路径是否和Servlet的请求路径一致。

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

注意:Filter的优先级天生就比Servlet优先级高;所以当路径一致是优先执行的是Filter,是否执行Servlet取决于以上写的那两个条件!!!

关于Filter的配置路径

  • 精确匹配(/a.do,/b.do,/oa/list…)
  • 匹配所有路径(/*
  • 后缀匹配,不要以 / 开始*.do
  • 前缀匹配,要以 / 开始(/dept/*)

Filter的执行顺序

web.xml文件中进行配置的时候,Filter的执行顺序是什么?

依靠filter-mapping标签的配置位置,越靠上优先级越高。

使用WebFilter注解配置时,Filter的执行顺序是什么?

比较Filter实现类的类名。

比如FilterA和FilterB,则先执行FilterA;
比如Filter1和Filter2,则先执行Filter1;

过滤器的调用顺序

遵循栈数据结构。

职责链设计模式

Filter过滤器这里有一个设计模式:职责链设计模式(也叫责任链设计模式)

过滤器最大的优点:

  • 在程序编译阶段不会确定调用程序,因为Filter的调用顺序是配置到web.xml文件中,只要修改web.xml配置文件中filter.mapping标签的顺序就可以调整Filter的执行顺序,显然Filter的执行顺序是在程序运行阶段动态组合的,那么这种设计模式被称为职责链设计模式。

  • 职责链设计模式最大的核心思想:
    在程序运行阶段,动态的组合程序的调用顺序。

Filter运用

可以看看我Gitee中的oa3,里面有通过Filter改进后的CRUD
使用Filter改进oa3

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

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

相关文章

HTML期末学生大作业-班级校园我的校园网页设计与实现html+css+javascript

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

[附源码]Python计算机毕业设计Django停车场管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

使用 JavaScript 检测用户是否在线

有时您可能希望增强您的应用程序以通知用户他们可能已经失去了互联网连接。 用户可能正在访问您的网站并收到缓存版本&#xff0c;因此通常看起来他们的互联网仍在工作。 然而&#xff0c;他们失去了引擎盖下的连接&#xff0c;并且不会加载任何新内容。 在这里向他们显示一些…

博客系统(页面设计)

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录前言一、【博客列表页】blog_list.html参考代码&#xff1a;二、【博客详情页】 blog_detail.html参考代码&#xff1a;三、【博客登录页】login.html参考代码&#xff1a;四、【博客编辑页】参考代码&#xff1a;【…

QFtp的使用

1. 环境 Win10 QT5.9.9 2. 相关说明 Qt5.0之后移除了QFtp类&#xff08;基于FTP协议实现的一个类&#xff09;&#xff0c;并且使用 QNetworkAccessManager 实现了 Ftp 的上传/下载功能。尽管后者在性能上和稳定性上有所提升&#xff0c;但有些原本 QFtp 有的功能 QNetwork…

什么是微服务?

文章目录什么是微服务微服务技术栈单体架构分布式架构认识微服务微服务技术框架SpringCloud什么是微服务 当我们提到微服务&#xff0c;很多人第一反应就是SpringCloud&#xff0c;但是微服务技术并不能与SpringCloud完全划等号&#xff1a; 微服务是分布式架构的一种&#x…

AI视频监控在畜牧养殖中的技术应用解决方案

一、方案概况 随着养殖业迅猛发展的同时也给养殖业主带来了严峻挑战。对养殖业来说&#xff0c;养殖场大多建立在偏远地区&#xff0c;给集中管理带来不便&#xff1b;畜禽养殖成本大&#xff0c;丢失、偷盗等情况时有发生&#xff0c;容易造成巨大的经济损失。建立一套远程视…

013. N 皇后

1.题目链接&#xff1a; 51. N 皇后 2.解题思路&#xff1a; 2.1.题目要求&#xff1a; 给一个数字 n &#xff0c;要求返回所有 n 个 皇后能在 n X n 的棋盘上 不相互攻击 的情况。 能攻击到的情况&#xff1a;以皇后自身为原点&#xff0c;横、竖、同斜线&#xff08;45度…

Linux搭建单机多进程zookeeper集群

01 ZooKeeper是什么 ZooKeeper 是一个开放源码的分布式协调服务&#xff0c;它是集群的管理者&#xff0c;监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终&#xff0c;将简单易用的接口和性能高效、功能稳定的系统提供给用户。 分布式应用程序可以基…

用数字隔离器取代传统的光耦合器

介绍 光耦合器是一种已有几十年历史的技术&#xff0c;广泛用于信号隔离&#xff0c;通常提供安全隔离、信号电平移位和地面回路缓解。它们通常用于广泛的终端应用中&#xff0c;包括数据通信电路、开关模式电源系统、测量和测试系统&#xff0c;以及孤立的数据采集系统。光耦…

【入门】初识深度学习

文档背景 机器学习和深度学习的概念十分火热。听上去也很难&#xff0c;不慌&#xff0c;有时候就需要行动在前脑子在后。不管&#xff0c;干就完啦。 前言 人工智能&#xff08;ArtificialIntelligence&#xff0c;AI&#xff09;是最宽泛的概念&#xff0c;是研发用于模拟、延…

数据库基本语法

SQL常用语句总结 mysql -u root -p mysql会提示你输入密码&#xff0c;输入安装配置MySQL服务时设置的密码即可。 输入如下命令生成样例数据库&#xff1a; CREATE DATABASE university; USE university; SOURCE <DLL.sql文件路径>; SOURCE <InsertStatements.sql文…

Jenkins实践指南--pipeline概述

1.pipeline概述 1.1 什么是pipeline 从某种抽象层次上讲&#xff0c;部署流水线&#xff08;Deployment pipeline&#xff09;是指从软件版本控制库到用户手中这一过程的自动化表现形式。——《持续交付-发布可靠软件的系统方法》 pipeline 英语愿意为管道&#xff0c;在Jen…

Python之路—200行Python代码搞了个打飞机游戏!!

早就知道pygame模块&#xff0c;就是没怎么深入研究过&#xff0c;恰逢这周未没约到妹子&#xff0c;只能自己在家玩自己啦&#xff0c;一时兴起&#xff0c;花了几个小时写了个打飞机程序。 很有意思&#xff0c;跟大家分享下。 先看一下项目结构 1 2 3 4 5 6 7 8 9 10 11 1…

盒子模型-css

个人学习笔记 文章目录1.什么是盒子模型&#xff1f;2.外边距3.css边框4.内边距1.什么是盒子模型&#xff1f; HTML文档中的每个元素都被描绘成矩形盒子&#xff0c;这些矩形盒子通过一个模型来描述其占用的空间&#xff0c;这个模型称为盒子模型。 盒子模型用四个边界描述&am…

打字的哪阿空扥

打字的那些事之快速移动光标 一## 、提出快速移动光标的原因 &#xff08;1&#xff09;键盘移动光标方向键不合理 情景再现&#xff1a; 当我们在打出一句话时&#xff0c;其中一个字打错&#xff0c;我们就需要去删除它&#xff0c;此时我们做的动作&#xff0c;无非有两种…

Linux知识结构体系简述

Linux 是一套免费使用和自由传播的类 Unix 操作系统&#xff0c;是一个基于 POSIX 和 UNIX 的多用户、多任务、支持多线程和多 CPU 的操作系统。严格来讲&#xff0c;Linux 这个词本身只表示 Linux 内核&#xff0c;但实际上人们已经习惯了用 Linux 来形容整个基于 Linux 内核&…

QFtp编译

QFtp下载&#xff1a;https://github.com/qt/qtftp 打开源码 修改头文件(不然编译会报错) 打开qftp.pro CONFIG static CONFIG - shared改成 CONFIG - static CONFIG shared也就是 - 号互换位置 4. 编译生成文件 linux下&#xff1a;*.a文件为.lib文件 windows下&#xf…

Python学习基础笔记二十六——推导式

列表推导式&#xff1a; 例1&#xff1a;30以内能被3整除的数&#xff1a; print([i for i in range(30) if i % 3 0]) 结果&#xff1a; 例2&#xff1a; 30以内能被3整除的数的平方&#xff1a; print([i**2 for i in range(30) if i % 3 0]) 结果&#xff1a; 例3&…

Golang sync.Map 原理(两个map实现 读写分离、适用读多写少场景)

参考&#xff1a; 由浅入深聊聊Golang的sync.Map 通过对源码的逐行分析&#xff0c;清晰易懂Golang sync.Map原理 通过向 sync.Map 中增删改查来介绍sync.Map的底层原理Golang中sync.Map的实现原理是什么 很好的概括了sync.Map的原理手摸手Go 深入理解sync.Map 知乎大佬 大家…