SpringBoot中实现拦截器和过滤器

news/2025/1/7 22:42:24/

【SpringBoot中实现过滤器和拦截器】

1.过滤器和拦截器简述
过滤器Filter和拦截器Interceptor,在功能方面很类似,但在具体实现方面差距还是比较大的。

2.过滤器的配置
2.1 自定义过滤器,实现Filter接口(SpringBoot 3.0 开始,jakarta.servlet.Filter,jdk需要升级到17)
2.2 重写doFilter,实现过滤逻辑,酌情放行
2.3 创建注解,实现过滤的范围配置

3.拦截器的配置

3.1 自定义拦截器,实现HandlerInterceptor接口
3.2 实现接口中的拦截方法(preHandle-请求执行前、postHandler-请求执行后、aftercompletion-视图渲染后)
3.3 创建配置类,实现WebMvcConfigurer接口,重写addInterceptors方法

4.总结
4.1 Filter依赖于Servlet容器,属于Servlet规范的一部分,而Interceptor依赖于SpringMVC框架;【所依赖框架】
4.2 Filter的生命周期由servlet容器管理,而Interceptor通过IOC容器来管理,可通过注入等方式来获取其Bean的实例;【管理的容器】
4.3 Filter可拦截所有web资源(包括]sp,Servlet,静态资源),而Interceptor则只拦截controller。【拦截范围】

代码

1、过滤器:

javascript">@RestController
public class MyController {@GetMapping("/filter")public String filter() {return "filter";}
}
javascript">package com.example.demos.web.filter;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Objects;
/*** @date 2025/1/5 18:06* @description ip 请求的次数*/
@Component
//所有请求都会经过这个过滤器
@WebFilter(urlPatterns = "/*")
public class MyFilter implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) servletRequest;// 获取请求的ipString ip = request.getRemoteAddr();HttpSession session = request.getSession();Integer count = (Integer) session.getAttribute("count");count=Objects.isNull(count)?1:++count;System.out.println("ip:"+ip+" count:"+count);session.setAttribute("count", count);//放行filterChain.doFilter(servletRequest, servletResponse);}
}

结果:
在这里插入图片描述
在这里插入图片描述

2、拦截器

javascript">@RestController
public class MyController {@GetMapping("/interceptor")public String filter() {return "interceptor";}
}

进行拦截处理

javascript">public class MyHandlerInterceptor  implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 获取请求的ipString ip = request.getRemoteAddr();HttpSession session = request.getSession();Integer count = (Integer) session.getAttribute("count");count= Objects.isNull(count)?1:++count;System.out.println("ip:"+ip+" count:"+count);session.setAttribute("count", count);//放行return true;}
}

配置文件需要将自定义拦截器进行注册

javascript">@Configuration
public class InterceptorConfiguration implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {MyHandlerInterceptor interceptor = new MyHandlerInterceptor();//拦截所有请求registry.addInterceptor(interceptor).addPathPatterns("/**");}
}

结果:
在这里插入图片描述

在这里插入图片描述


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

相关文章

每天学一点强化学习(二)

《动手学强化学习》模仿学习代码的修改 由于版本的不同,模仿学习中的代码需要有一些做出修改, def test_agent(agent, env, n_episode):return_list []for episode in range(n_episode):episode_return 0state env.reset()[0] # 修改位置done False…

向量的导数

向量的导数 向量的导数取决于你对向量的上下文和所涉及的变量维度。常见情况下,我们主要讨论以下两种情况: 1. 标量函数对向量的导数 如果一个标量函数 f ( x ) f(\mathbf{x}) f(x) 是关于向量 x [ x 1 , x 2 , … , x n ] ⊤ \mathbf{x} [x_1, x…

自动驾驶3D目标检测综述(六)

停更了好久终于回来了(其实是因为博主去备考期末了hh) 这一篇接着(五)的第七章开始讲述第八章的内容。第八章主要介绍的是三维目标检测的高效标签。 目录 第八章 三维目标检测高效标签 一、域适应 (一)…

【HeadFirst系列之HeadFirst设计模式】第1天之HeadFirst设计模式开胃菜

HeadFirst设计模式开胃菜 前言 从今日起,陆续分享《HeadFirst设计模式》的读书笔记,希望能够帮助大家更好的理解设计模式,提高自己的编程能力。 今天要分享的是【HeadFirst设计模式开胃菜】,主要介绍了设计模式的基本概念、设计模…

qemu-kvm使用简介

qemu-kvm-note qemu-kvm使用简介 kvm和qemu关系 kvm是linux的一个模块,是工作在cpu硬件支持基础之上的虚拟化技术。加载该模块后,才能进一步通过其他工具创建虚拟机。仅有kvm模块,用户无法直接控制内核模块,必须有一个用户空间…

计算机网络——数据链路层-介质访问控制

一、介质访问控制方法 在局域网中, 介质访问控制(medium access control)简称MAC,也就是信道访问控制方法,可以 简单的把它理解为如何控制网络节点何时发送数据、如何传输数据以及怎样在介质上接收数据, 是解决当局域网中共用信道的使用产生竞…

论文研读:Text2Video-Zero 无需微调,仅改动<文生图模型>推理函数实现文生视频(Arxiv 2023-03-23)

论文名:Text2Video-Zero: Text-to-Image Diffusion Models are Zero-Shot Video Generators 1. 摘要 1.1 方法总结 通过潜空间插值, 实现动作连续帧。 以第一帧为锚定,替换原模型的self-attention,改为cross-attention 实现 保证图片整体场…

Python中的ast.literal_eval:安全地解析字符串为Python对象

Python中的ast.literal_eval:安全地解析字符串为Python对象 什么是ast.literal_eval?为什么说它是“安全”的? 如何使用ast.literal_eval?示例1:将字符串转换为列表示例2:将字符串转换为字典示例3&#xff…