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

SpringBoot中实现拦截器和过滤器

【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、过滤器:

@RestController
public class MyController {@GetMapping("/filter")public String filter() {return "filter";}
}
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、拦截器

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

进行拦截处理

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;}
}

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

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

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

在这里插入图片描述

http://www.lryc.cn/news/516330.html

相关文章:

  • 不锈钢均温板结合强力粘合技术革新手机内部架构
  • Docker安装使用
  • React 如何进行路由变化监听
  • Unity UGUI使用技巧与经验总结(不定期更新)
  • 中国乡镇界shp全境arcgis格式shp数据乡镇名称下载后内容测评
  • 第 31 章 - 源码篇 - Elasticsearch 写入流程深入分析
  • node.js下载、安装、设置国内镜像源(永久)(Windows11)
  • 小于n的最大数 - 贪心算法 - C++
  • 【顶刊TPAMI 2025】多头编码(MHE)之极限分类 Part 3:算法实现
  • 解决CentOS 8 YUM源更新后报错问题:无法下载AppStream仓库元数据
  • [python3]Excel解析库-openpyxl
  • Docker 远程访问完整配置教程以及核心参数理解
  • 王老吉药业SRM系统上线 携手隆道共启战略合作新篇章
  • MyBatis 配置文件全解析
  • unity学习6:unity的3D项目的基本界面和菜单
  • 企业二要素如何用C#实现
  • 中科院空天院无人机视觉语言导航新基准!AeroVerse:模拟、预训练、微调和评估空中无人机具身世界模型的测试基准
  • Python安装(新手详细版)
  • Oracle DG备库数据文件损坏修复方法(ORA-01578/ORA-01110)
  • 安装Linux
  • 【文献精读笔记】Explainability for Large Language Models: A Survey (大语言模型的可解释性综述)(四)
  • 【OpenCV】使用Python和OpenCV实现火焰检测
  • SpringCloud(二)--SpringCloud服务注册与发现
  • 国内Ubuntu环境Docker部署CosyVoice
  • 嵌入式linux系统中QT信号与槽实现
  • 科研绘图系列:R语言单细胞数据常见的可视化图形
  • 使用 C++ 和函数式编程构建高效的 AI 模型
  • guestfish/libguestfs镜像管理工具简介
  • 如何在centos中进行有效的网络管理
  • Oracle清空表后如何恢复数据