【WEB系列】过滤器Filter

Filter,过滤器,属于Servlet规范,并不是Spring独有的。其作用从命名上也可以看出一二,拦截一个请求,做一些业务逻辑操作,然后可以决定请求是否可以继续往下分发,落到其他的Filter或者对应的Servlet
简单描述下一个http请求过来之后,一个Filter的工作流程:

  • 首先进入filter,执行相关业务逻辑
  • 若判定通行,则进入Servlet逻辑,Servlet执行完毕之后,又返回Filter,最后在返回给请求方
  • 判定失败,直接返回,不需要将请求发给Servlet

image.png
这次测试用到的依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><version>3.0.7</version>
</dependency><!-- MySQL Connector -->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.11</version>
</dependency><!-- Lombok -->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.32</version><scope>provided</scope>
</dependency><!-- MyBatis-Plus -->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>3.5.5</version>
</dependency><!-- Spring Boot Starter JDBC -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId><version>3.3.0</version>
</dependency><!-- HikariCP -->
<dependency><groupId>com.zaxxer</groupId><artifactId>HikariCP</artifactId><version>5.0.0</version>
</dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.1</version><scope>compile</scope>
</dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>RELEASE</version><scope>compile</scope>
</dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>6.0.9</version>
</dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-test</artifactId><version>3.0.7</version>
</dependency><!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.47</version>
</dependency></dependencies>

在Spring中,如果需要定义一个过滤器,直接实现Filter接口即可

package com.hayaizo.transactional.filter;import com.alibaba.fastjson.JSON;
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;import java.io.IOException;@Slf4j
@WebFilter
public class ReqFilter implements Filter {public ReqFilter() {System.out.println("init reqFilter");}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {HttpServletRequest req = (HttpServletRequest) request;log.info("url={}, params={}", req.getRequestURI(), JSON.toJSONString(req.getParameterMap()));chain.doFilter(req, response);}@Overridepublic void destroy() {}
}

实现一个自定义的Filter容易,一般有两个步骤

  • 实现 Filter 接口
  • 在doFilter方法中添加业务逻辑,如果允许访问继续,则执行chain.doFilter(req, response);; 不执行上面这一句,则访问到此为止

接下来的一个问题就是如何让我们自定义的Filter生效,在SpringBoot项目中,有两种常见的使用方式

  • @WebFilter
  • 包装Bean: FilterRegistrationBean

那么如何让@WebFilter生效呢?

在Spring的启动类上添加@ServletComponentScan注解即可。

image.png
WebFilter常用属性如下,其中urlPatterns最为常用,表示这个filter适用于哪些url请求(默认场景下全部请求都被拦截)
@WebFilter注解是Java Servlet规范中用于定义过滤器的注解。它有多个属性,每个属性都有特定的类型和用途。以下是@WebFilter注解的属性、类型和用途的表格:

属性名类型用途
filterNameString指定过滤器的名称。
urlPatternsString[]指定过滤器的URL模式(可以是多个)。
valueString[]等同于urlPatterns,是一个快捷方式(不能同时使用urlPatternsvalue)。
servletNamesString[]指定过滤器应用到的Servlet名称。
dispatcherTypesDispatcherType[]指定过滤器应用到的调度类型,如REQUEST, FORWARD, INCLUDE, ERROR, ASYNC
initParamsWebInitParam[]指定过滤器的初始化参数。
asyncSupportedboolean指定过滤器是否支持异步操作,默认为false
descriptionString过滤器的描述信息。
displayNameString过滤器的显示名称。
smallIconString过滤器的小图标。
largeIconString过滤器的大图标。

下面给出一个具体例子来更好的理解这些注解的使用方法和含义

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;// 定义一个过滤器,使用@WebFilter注解
@WebFilter(filterName = "ExampleFilter", urlPatterns = {"/example/*"}, dispatcherTypes = {DispatcherType.REQUEST, DispatcherType.FORWARD}, initParams = {@WebInitParam(name = "param1", value = "value1"),@WebInitParam(name = "param2", value = "value2")},asyncSupported = true,description = "This is an example filter",displayName = "Example Filter"
)
public class ExampleFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// 获取初始化参数String param1 = filterConfig.getInitParameter("param1");String param2 = filterConfig.getInitParameter("param2");System.out.println("Filter initialized with parameters: " + param1 + ", " + param2);}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {// 在请求处理之前执行的代码System.out.println("ExampleFilter is filtering the request...");// 继续执行请求chain.doFilter(request, response);// 在响应返回给客户端之前执行的代码System.out.println("ExampleFilter has filtered the response...");}@Overridepublic void destroy() {// 清理资源System.out.println("ExampleFilter is being destroyed...");}
}
  • filterName 指定了过滤器的名称为 “ExampleFilter”。
  • urlPatterns 指定了过滤器应用于以 “/example/” 开头的URL。
  • dispatcherTypes 指定了过滤器应用于 REQUESTFORWARD 类型的请求调度。
  • initParams 指定了两个初始化参数 “param1” 和 “param2” 及其对应的值。
  • asyncSupported 指定过滤器支持异步操作。
  • description 提供了过滤器的描述信息。
  • displayName 指定了过滤器的显示名称。

对于执行顺序
结论:对于被Spring管理的Filter过滤器可以使用@Order注解来设置执行顺序
也可以使用FilterRegistrationBean来包装自定义的Filter

@Beanpublic FilterRegistrationBean<ReqFilter> filterRegistrationBean(ReqFilter reqFilter) {FilterRegistrationBean<ReqFilter> filterRegistrationBean = new FilterRegistrationBean<>();filterRegistrationBean.setFilter(reqFilter);filterRegistrationBean.addUrlPatterns("/*");filterRegistrationBean.setOrder(2147483647);return filterRegistrationBean;}

此外格外注意, @WebFilter声明的Filter,优先级为2147483647(最低优先级)

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

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

相关文章

海报在线制作系统

文章转载自&#xff1a;FastAdmin海报在线制作系统 - 源码1688 应用介绍 介绍 新机构海报是一款基于FastAdminThinkPHP开发的一款新机构海报。 采用JavaScript vue canvas技术&#xff0c;实现在线一键制作海报&#xff0c;生成海报。 功能特性 1、自由创作 2、一键制作…

Django使用正则表达式

本书1-7章样章及配套资源下载链接: https://pan.baidu.com/s/1OGmhHxEMf2ZdozkUnDkAkA?pwdnanc 源码、PPT课件、教学视频等&#xff0c;可以从前言给出的下载信息下载&#xff0c;大家可以评估一下。 在Django框架的新版本&#xff08;v2.0 &#xff09;中&#xff0c;URLc…

ECharts 图形化看板 模板(简单实用)

目录 一、官网 二、模板 ①定义请求​编辑 ② 将请求统一管理&#xff0c;别的页面引用多个请求时更便于导入。​编辑 ③最终模板 三、执行效果 四、后端代码 4.1 controller 4.2 xml 4.3 测试接口 一、官网 获取 ECharts - 入门篇 - 使用手册 - Apache ECharts 二、…

ARM32开发——串口库封装(初级)

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 开发流程分组创建 接口定义完整代码 开发流程 在文件系统中&#xff0c;创建库目录Library在keil工程中&#xff0c;创建分组管理…

Vue3-组件通信详解

文章目录 组件通信的含义Vue3组件通信和Vue2的区别组件通信的具体实现props&#xff08;父子组件通信&#xff09;自定义事件&#xff08;子传父&#xff09;mitt&#xff08;任意组件间通信&#xff09;v-model$attrs &#xff08;非props的父子组件通信&#xff09; r e f s …

知识图谱应用---智慧金融

文章目录 智慧金融典型应用 智慧金融 智慧金融作为一个有机整体&#xff0c;知识图谱提供了金融领域知识提取、融合、分析、推断、决策等功能&#xff0c;如下图所示。在场景方面&#xff0c;智慧金融涵盖智慧支付、智慧财富管理、智慧银行、智慧证券、智慧保险、智慧风控等诸多…

智能分析设备助力废固运输车辆信息采集

进出车辆信息采集&#xff0c;这一环节可谓是整个废固生产及处理企业监管体系中的基石。前端摄像机以其敏锐的感知能力&#xff0c;精准捕捉废固运输车辆的车牌、车头、车尾以及车厢的细致画面&#xff0c;同时记录下对应的视频流信息。这些信息的采集不仅为后续的监管提供了详…

Git存储库的推送保护

Git存储库的推送保护 昨天有一个提交一直提示&#xff1a;Push rejected Push rejected Push master to origin/master was rejected by remote起初在网络上找各种解决办法&#xff0c;先列举以下找到的各类方法 提交用户的用户名和邮箱与Git不一致&#xff0c;这个只需要通…

Warning:成交前,永远相信意外即将发生

作为一名首次次创业者&#xff0c;随着创业进入深层次阶段&#xff0c;越来越感觉到&#xff1a;创业是一条不归路&#xff0c;因为路上不止有惊喜&#xff0c;还有风尘。创业之前我认为世界是“天圆地方”的&#xff0c; 创业后你猜我怎么看这个世界的&#xff1f; 创业前我一…

项目-基于LangChain的ChatPDF系统

问答系统需求文档 一、项目概述 本项目旨在开发一个能够上传 PDF 文件&#xff0c;并基于 PDF 内容进行问答互动的系统。用户可以上传 PDF 文件&#xff0c;系统将解析 PDF 内容&#xff0c;并允许用户通过对话框进行问答互动&#xff0c;获取有关 PDF 文件内容的信息。 二、…

excel 插入图片不变形的方法

在单元格内插入形状&#xff0c; 设置图片格式 设置图片的高宽

【Linux进程篇】Linux中的等待机制与替换策略

W...Y的主页 &#x1f60a; 代码仓库分享&#x1f495; 目录 ​编辑 进程等待 进程等待必要性 进程等待的方法 wait方法 waitpid方法 获取子进程status 阻塞与非阻塞 进程程序替换 替换原理 替换函数 进程等待 进程等待必要性 之前讲过&#xff0c;子进程退出&am…

傲医医疗集成引擎 Rhapsody 在超融合信创平台表现如何?

作者&#xff1a;SmartX 商业团队 黄玉辉 随着越来越多的医疗用户基于超融合基础设施实现 IT 基础架构信创转型&#xff0c;超融合信创架构在医疗业务场景中的实际表现也得到更多关注。尤其是集成平台业务场景——作为三甲医院互联互通评级中不可缺少的核心业务系统&#xff0…

“云环境下的等保测评新趋势:混合云安全策略与合规性考量“

在云环境尤其是混合云场景下&#xff0c;等保测评&#xff08;信息安全等级保护测评&#xff09;的新趋势聚焦于更加灵活、高效且全面的安全策略&#xff0c;以及确保合规性。以下是几个关键点&#xff1a; 混合云安全策略的新趋势&#xff1a; 1. 统一安全管理&#xff1a;由…

概率分布、回归分析、假设检验……用 DolphinDB 函数库快速实现概率统计分析

在金融和物联网等领域&#xff0c;概率统计与分析扮演着至关重要的角色。DolphinDB 作为一款强大的时序数据库&#xff0c;提供了一系列内置的概率统计与分析函数&#xff0c;能够满足用户的各种需求。 金融领域 风险管理&#xff1a;通过概率统计分析&#xff0c;金融机构可…

【主题广泛|投稿优惠】2024年交通运输与信息科学国际会议(ICTIS 2024)

2024年交通运输与信息科学国际会议&#xff08;ICTIS 2024&#xff09; 2024 International Conference on Transportation and Information Science 【重要信息】 大会地点&#xff1a;青岛 大会官网&#xff1a;http://www.icictis.com 投稿邮箱&#xff1a;icictissub-conf.…

【Vue】成绩案例

文章目录 一、功能描述二、思路分析三、完整代码 一、功能描述 1.渲染功能 2.删除功能 3.添加功能 4.统计总分&#xff0c;求平均分 二、思路分析 渲染功能 v-for :key v-bind:动态绑定class的样式&#xff08;来回切换&#xff09; 删除功能 v-on绑定事件&#xff0c; 阻止…

线性代数|机器学习-P2 A的列向量空间

文章目录 1. Ax矩阵的形式2. ACR 矩阵分解2.1 rank1 矩阵分解2.2 rank2 矩阵分解2.3 ACMR,求M 3. Ax 向量 1. Ax矩阵的形式 假设我们有如下矩阵A&#xff1a; A x [ 2 1 3 3 1 4 5 7 12 ] [ x 1 x 2 x 3 ] \begin{equation} Ax\begin{bmatrix} 2&1&3\\\\ 3&1&am…

【微信小程序开发】小程序中的上滑加载更多,下拉刷新是如何实现的?

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

期望20K,2年golang深圳某互联网小公司一面

后续约了二面&#xff08;CTO面&#xff09;&#xff0c;需要到现场&#xff0c;基本没问啥具体的技术知识&#xff0c;都是聊规划和个人职业目标 一面 1、假设访问百度网站&#xff0c;从在浏览器输入网址&#xff0c;到最终页面展示出来&#xff0c;中间会发生哪些事情&…