当前位置: 首页 > news >正文

总结贴:Servlet过滤器、MVC拦截器

一:Servlet过滤器


1.1解析

        Filter 即为过滤,用于请求到达Servlet之前(Request),以及再Servlet方法执行完之后返回客户端进行后处理(HttpServletResponse)。简单说就是对请求进行预处理,对响应进行后处理
        在请求到达Servlet之前,可以经过多个Filter,即Filter 链。再相应客户端也会相应经过多个Filter。
         过滤器当请求访问资源时,过滤器执行的顺序是1->2->3,到达资源中后,响应的顺序是3->2->1。

方法解析:
        init()方法:初始化的时候执行。
        doFilter()方法:执行过滤。
        destroy()方法:调用doFilter()方法之后,执行销毁资源的。

1.2步骤


a:定义一个类,类上标注注解@WebFilter,并实现接口Filter

b:复写方法init()、doFilter()、destroy()----主要就复写doFilter()就行

@WebFilter(urlPatterns="/*")//访问所有资源之前,都会执行该过滤器。/*表示拦截所有路径,也可以拦截指定某路径
@Order(1)//过滤器执行顺序,越小越先执行。
public class MyFilter implements Filter {//Demo:统计访问ip的Controller次数public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("filterDemo01被执行了...");//获取请求HttpServletRequest request = (HttpServletRequest) servletRequest;//预处理逻辑://访问的ipString ip = request.getRemoteAddr();HttpSession session = request.getSession();Integer count = (Integer) session.getAttribute("count");count = Objects.isNull(count) ? 1 : ++count;session.setAttribute("count",count);System.out.println("count:"+count);//放行filterChain.doFilter(servletRequest,servletResponse);}

下面是第二个拦截器

@WebFilter(urlPatterns="/*")
@Order(2)
public class MyFilter2 implements Filter {//Demo:统计访问ip的Controller次数public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("filterDemo02被执行了...");//获取请求HttpServletRequest request = (HttpServletRequest) servletRequest;//预处理逻辑://访问的ipString ip = request.getRemoteAddr();HttpSession session = request.getSession();Integer count = (Integer) session.getAttribute("count");count = Objects.isNull(count) ? 1 : ++count;session.setAttribute("count",count);System.out.println("count:"+count);//放行filterChain.doFilter(servletRequest,servletResponse);}}
控制台执行效果是这样的,这就是过滤器链
filterDemo01被执行了...
count:1
filterDemo02被执行了...
count:2

二:MVC拦截器

2.1解析

        作用和filter类似


2.2步骤

a.自定义拦截器MyInterceptor,实现WebMvcConfigurer,重写方法preHandle(这个类似于过滤器的doFilter)

public class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("拦截器执行了");String ip = request.getRemoteAddr();HttpSession session = request.getSession();Integer count = (Integer) session.getAttribute("count");count = Objects.isNull(count) ? 1 : ++count;session.setAttribute("count",count);System.out.println("ip:"+ip+";"+"count:"+count);//进行放行,return true即放行;,return false就是不放行return true;}
}

b.拦截器配置类,(相当于把自定义的拦截器放入到ioc对象中)

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {//把自定义的拦截器放入到ioc对象中@Overridepublic void addInterceptors(InterceptorRegistry registry) {MyInterceptor myInterceptor = new MyInterceptor();//刚刚自定义的拦截器registry.addInterceptor(myInterceptor).addPathPatterns("/**");//把拦截器放入到ioc对象中,并且设置起效范围}
}

三:过滤器和拦截器区别?

a、 拦截器(Interceptor) 它是一个SpringMVC提供的一个逻辑处理的组件他是依赖于Spring的过滤器依赖于servlet容器,所以它只能在web程序中使用。

b、拦截器只是对处理器(Controller中的方法)进行拦截,但是不对JS,JSP等静态资源拦截。而过滤器则可以所有请求

b、拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。
d、如果项目中过滤器和拦截器同时存在,他们的执行顺序是:Filter、Servlet、Intercepter,再到达controller层

e、因为拦截器更靠近cotroller,并且可以很方便获取容器的中的各个Bean,所以更适合进行业务逻辑判断。比如登录判断、权限判断、日志记录。过滤器更适合全局性的功能过滤、比如敏感词过滤、字符集编码设置。过滤器适用于全局请求的拦截,拦截器可以实现更细粒度的逻辑处理

相关文章:

总结贴:Servlet过滤器、MVC拦截器

一:Servlet过滤器 1.1解析 Filter 即为过滤,用于请求到达Servlet之前(Request),以及再Servlet方法执行完之后返回客户端进行后处理(HttpServletResponse)。简单说就是对请求进行预处理,对响应进行后处理 在请求到达Servlet之前,可以经过多个Filt…...

鸿蒙开发:自定义一个任意位置弹出的Dialog

前言 鸿蒙开发中,一直有个问题困扰着自己,想必也困扰着大多数开发者,那就是,系统提供的dialog自定义弹窗,无法实现在任意位置进行弹出,仅限于CustomDialog和Component struct的成员变量,这就导致…...

在Windows下编译支持https的wsdl2h

下载源码 在官网下载源码 安装Openssl 下载OpenSSL并安装,安装完成后需要将OpenSSL的路径添加到环境变量中 配置VS 1、打开工程 2、因为前面安装的OpenSLL是64位的,因此需要创建一个X64的配置 打开配置管理器,然后选择新建&#xff0…...

PHP和GD库如何根据像素绘制图形

使用PHP和GD库,你可以根据像素绘制各种图形,比如点、线、矩形、圆形等。GD库是PHP的一个扩展,它提供了一系列用于创建和处理图像的函数。以下是一个简单的示例,展示如何使用GD库根据像素绘制图形。 安装GD库 首先,确…...

webpack(react)基本构建

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 Webpack 是一个现代 JavaScript 应用程序的静态模块打包工具。它的主要功能是将各种资源(如 JavaScript、CSS、图片等)视为模块,并将它们打包成一个或多个输出文件,以便…...

《Opencv》基础操作<1>

目录 一、Opencv简介 主要特点: 应用领域: 二、基础操作 1、模块导入 2、图片的读取和显示 (1)、读取 (2)、显示 3、 图片的保存 4、获取图像的基本属性 5、图像转灰度图 6、图像的截取 7、图…...

Oracle 11g R2 RAC 到单实例 Data Guard 搭建(RMAN备份方式)

一、配置方案 环境说明 角色主库主库备库主机名rac01rac02racdg公网IP10.10.10.14110.10.10.14310.10.10.191VIP10.10.10.14210.10.10.144-SCAN10.10.10.14010.10.10.140-INSTANCE_NAMEorcl1orcl2orclDB_NAMEorclorclorclSERVICE_NAMEorclorclorclDB_UNIQUE_NAMEorclorclorcl…...

HTTPS 加密

HTTPS 加密技术 1. HTTPS 概述 HTTPS(HyperText Transfer Protocol Secure)是 HTTP 协议的安全版本,利用 SSL/TLS 协议对通信进行加密,确保数据的机密性、完整性和身份认证。HTTPS 在保护敏感数据的传输(如登录凭证、…...

泛微e9开发 编写前端请求后端接口方法以及编写后端接口

泛微e9开发 前端请求后端接口以及后端发布接口 前端请求后端接口 前端发起get请求 fetch(/api/youpath, {method: GET, // 默认 GET 方法,可以省略headers: {Content-Type: application/json, // 通常 GET 请求无需指定 body,Content-Type 不太重要},…...

Linux —— 《线程控制》

文章目录 前言:为什么要链接pthread库?线程控制:线程创建:start_routine?传递自定义类型同一份栈空间? 线程等待:返回值与参数?创建多线程 线程终止线程分离 前言: 上一文我们学习…...

基于HTML+CSS的房地产销售网站设计与实现

摘 要 房地产销售系统,在二十年来互联网时代下有着巨大的意义,随着互联网不断的发展扩大,一个方便直 观的房地产管理系统的网站开发是多么地有意义,不仅打破了传统的线下看房,线下获取资讯,也给房地产从业…...

操作系统 | 学习笔记 | 王道 | 2.4死锁

2.4 死锁 文章目录 2.4 死锁2.4.1 死锁的概念2.4.2 死锁预防2.4.3 死锁避免2.4.4 死锁检测和解除 2.4.1 死锁的概念 死锁的定义 在并发环境下,各进程因竞争资源而造成的一种互相等待对方手里的资源,导致各进程都阻塞,都无法向前推进的现象&am…...

【FPGA开发】Vivado自定义封装IP核,绑定总线

支持单个文件的封装、整个工程的封装,这里用单个文件举例。 在文件工程目录下,自建一个文件夹,里面放上需要封装的verilog文件。 选择第三个,指定路径封装,找到文件所在目录 取个名,选择封装IP的路径 会…...

python的3D可视化库vedo-3 (visual模块)点对象的属性、光效、附注

文章目录 3 PointsVisual的方法3.1 对象属性3.1.1 顶点大小3.1.2 复制属性3.1.3 颜色设置3.1.4透明度设置 3.2 对象光效3.2.1 点的形状3.2.2 点的表面光效 3.3 尾随线和投影3.3.1 尾随线3.3.2 投影 3.4 给对象附加文字说明3.4.1 标注3.4.2 2D标注3.4.3 气泡说明3.4.4 旗标说明3…...

llamaindex实战-ChatEngine-ReAct Agent模式

概述 ReAct 是一种基于Agent的聊天模式,构建在数据查询引擎之上。对于每次聊天交互,代理都会进入一个 ReAct 循环: 首先决定是否使用查询引擎工具并提出适当的输入 (可选)使用查询引擎工具并观察其输出 决定是否重复…...

redis快速进门

、数据库类型认识 关系型数据库 关系型数据库是一个结构化的数据库,创建在关系模型(二维表格模型)基础上,一般面向于记录。 SQL 语句(标准数据查询语言)就是一种基于关系型数据库的语言,用于执行…...

从0开始linux(39)——线程(2)线程控制

欢迎来到博主的专栏:从0开始linux 博主ID:代码小豪 文章目录 线程创建线程标识符线程参数多线程竞争资源 回收线程detach 线程退出pthread_cancel 线程创建 线程创建的函数为pthread_create。该函数是包含在posix线程库当中,posix线程是C语言…...

International Journal of Medical Informatics投稿经历时间节点

20240423,完成投稿 20240612,按编辑要求修改后再投, with editor 20240613,under review,completed 0, accepted 0, invitation 2. 20240620, under review,completed 0, accepted 1, invitation 2. 20240626, unde…...

BUUCTF—Reverse—Java逆向解密(10)

程序员小张不小心弄丢了加密文件用的秘钥,已知还好小张曾经编写了一个秘钥验证算法,聪明的你能帮小张找到秘钥吗? 注意:得到的 flag 请包上 flag{} 提交 需要用专门的Java反编译软件:jd-gui 下载文件,发现是个class文…...

CLIP-MMA: Multi-Modal Adapter for Vision-Language Models

当前的问题 CLIP-Adapter仅单独调整图像和文本嵌入,忽略了不同模态之间的交互作用。此外,适应性参数容易过拟合训练数据,导致新任务泛化能力的损失。 动机 图1所示。多模态适配器说明。 通过一种基于注意力的 Adapter ,作者称之…...

三维扫描仪-3d扫描建模设备自动检测尺寸

在现代工业制造领域,三维扫描仪已成为实现高精度尺寸检测的关键设备。CASAIM自动化智能检测系统以其自动化三维立体扫描技术,为产品尺寸的自动检测提供了高效、可靠的解决方案。 CASAIM自动化智能检测系统通过非接触式测量方式,通过激光扫描…...

vue3+ant design vue实现日期选择器默认显示当前年,并限制用户只能选择当前年及之前~

1、思路:之前想拿当前年直接做赋值操作,实际上是行不通的,因为组件本身有数据格式限制,会出现报错,然后索性直接获取当前日期(YYYY-MM-DD)赋值给日期组件,这样不管你用的是年&#x…...

【electron-vite】搭建electron+vue3框架基础

一、拉取项目 electron-vite 中文文档地址: https://cn-evite.netlify.app/guide/ 官网网址:https://evite.netlify.app/ 版本 vue版本:vue3 构建工具:vite 框架类型:Electron JS语法:TypeScript &…...

05《存储器层次结构与接口》计算机组成与体系结构 系列课

目录 存储器层次结构概述 层次结构的定义 存储器的排名 存储器接口 处理器与存储器的速度匹配 存储器接口的定义 存储器访问命中率 两种接口 第1种方式:并行 命中率的计算 存储器访问时间 第2种方式:逐级 结语 大家好,欢迎回来。…...

elasticsearch报错fully-formed single-node cluster with cluster UUID

1.问题描述 k8s集群内部署的es中间件起不来,查看日志发现如下警告,节点发现功能开启,但是目前我是单节点服务,所以尝试编辑sts将节点发现功能去掉或者在部署时将你的sts的yaml文件和chart文件修改重新部署以去掉该功能 {"t…...

Milvus×Florence:一文读懂如何构建多任务视觉模型

近两年来多任务学习(Multi-task learning)正取代传统的单任务学习(single-task learning),逐渐成为人工智能领域的主流研究方向。其原因在于,多任务学习可以让我们以最少的人力投入,获得尽可能多…...

DAPP

02-DAPP 1 啥是 DApp? DApp,部署在链上的去中心化的应用。 DApp 是开放源代码,能运行在分布式网络上,通过网络中不同对等节点相互通信进行去中心化操作的应用。 DAPP 开放源代码,才能获得人的信任。如比特币&#xff…...

生产环境中,nginx 最多可以代理多少台服务器,这个应该考虑哪些参数 ?怎么计算呢

生产环境中,nginx 最多可以代理多少台服务器,这个应该考虑哪些参数 ?怎么计算呢 关键参数计算方法评估步骤总结 在生产环境中,Nginx最多可以代理的服务器数量并没有一个固定的限制,它取决于多个因素,包括Ng…...

【深度学习|目标跟踪】StrongSORT 详解(以及StrongSORT++)

StrongSort详解 1、论文及源码2、DeepSORT回顾3、StrongSORT的EMA4、StrongSORT的NSA Kalman5、StrongSORT的MC6、StrongSORT的BOT特征提取器7、StrongSORT的AFLink8、StrongSORT的GSI模块 1、论文及源码 论文地址:https://arxiv.org/pdf/2202.13514 源码地址&#…...

23种设计模式-原型(Prototype)设计模式

文章目录 一.什么是原型设计模式?二.原型模式的特点三.原型模式的结构四.原型模式的优缺点五.原型模式的 C 实现六.原型模式的 Java 实现七. 代码解析八.总结 类图: 原型设计模式类图 一.什么是原型设计模式? 原型模式(Prototype…...

浙江做铁塔的公司网站/非企户百度推广

This tutorial is highly referenced from Emmanuel Henri’s LinkedIn Learning tutorial released 11/5/2019.本教程由Emmanuel Henri于2019年11月5日发布的LinkedIn学习教程高度引用。 It took me a long time to find a resource to help me on my journey of building a …...

wordpress php加密/长春seo排名收费

Python输出语句print函数print()函数基本使用打印整形数据打印浮点型数据打印字符型数据>>> print(12)12>>> print(12.5)12.5>>> print(B)B>>> print(WWW.baidu.com)WWW.baidu.com>>> x12>>> print(12)12>>> y…...

有个专门做装修的网站/硬件优化大师下载

更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 数据治理伴随着数据全生命周期的进程,涉及事前规范检查、事中监控管理、事后优化复盘等过程,关键重点领域包括数据质量的可用性、一致性&…...

做网站的手机软件/今日新闻最新头条10条摘抄

结直肠癌是常见的消化道肿瘤之一,我国的结直肠癌发病率和病死率均居于前列。近年来随着靶向治疗和免疫治疗在结直肠癌治疗中的应用,晚期结直肠癌的治疗进入了一个新的阶段。结直肠癌疗效预测和预后评估分子标志物对临床制订正确的治疗方案非常重要。在7月…...

邢台网站建设服务周到/凡科建站

【2018.02】劳特利奇国防研究手册(第一版)Routledge Handbook of Defence Studies,共412页。 如果需要电子版,请联系QQ:3042075372。 Routledge是英国的一家跨国出版社,总部设在伦敦,主要在伦敦…...

做家务的男人们在哪个网站播出/河北seo技术交流

SQL分组获取随机记录 2017-12-30 08:59:32 一木剑 阅读数 1038更多 分类专栏: SQL 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/q…...