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

SpringBoot中实现拦截器和过滤器

1.过滤器和拦截器简述

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

  • 1.1 运行顺序不同:FilterServletInterceptorController
  • 1.2 配置方式不同:Filterweb.xml中进行配置,InterceptorSpring的配置文件中进行配置(或注解);
  • 1.3 依赖环境不同:Filter依赖于Servlet容器,而Interceptor不依赖Servlet容器;
  • 1.4 操作对象不同:Filter只能对requestresponse进行操作,而Interceptor可对requestresponsehandlermodelAndViewexception进行操作(对Spring MVC生态下组件的操作能力)。

2.过滤器的配置

  • 2.1 自定义过滤器,实现Filter接口(Springboot3开始,jakarta.servlet.Filter)
import javax.servlet.*;
import java.io.IOException;public class MyFilter implements Filter {}
  • 2.2 重写doFilter,实现过滤逻辑,酌情放行
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Objects;/*** 自定义过滤器:实现根据IP统计访问次数*/
public class MyFilter implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {// 获取访问的IPHttpServletRequest request = (HttpServletRequest) servletRequest;String ip = request.getRemoteAddr();// 统计访问次数并输出HttpSession session = request.getSession();Integer count = (Integer) session.getAttribute("count");count = Objects.isNull(count) ? 1 : ++count;System.out.println("ip:" + ip + "\tcount:" + count);session.setAttribute("count", count);// 放行filterChain.doFilter(servletRequest, servletResponse);}
}
  • 2.3 添加@WebFilter@ServletComponentScan注解,实现过滤的范围配置
import javax.servlet.annotation.WebFilter;/*** 自定义过滤器:实现根据IP统计访问次数*/
@WebFilter(urlPatterns = "/*")
public class MyFilter implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {// 放行filterChain.doFilter(servletRequest, servletResponse);}
}
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;@SpringBootApplication
@ServletComponentScan(basePackages = "com.neusoft.springboot.filter")
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

3.拦截器的配置

  • 3.1 自定义拦截器,实现HandlerInterceptor接口
import org.springframework.web.servlet.HandlerInterceptor;public class MyInterceptor implements HandlerInterceptor {}
  • 3.2 实现接口中的拦截方法(preHandle-请求执行前、postHandler-请求执行后、afterCompletion-视图渲染后)
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.Objects;public class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 记录访问IP的次数逻辑// 获取访问的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 + "\tcount:" + count);session.setAttribute("count", count);// 放行return true;}
}
  • 3.3 创建配置类,实现WebMvcConfigurer接口,重写addInterceptors方法
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;public class InterceptorConfiguration implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {MyInterceptor myInterceptor = new MyInterceptor();registry.addInterceptor(myInterceptor).addPathPatterns("/*");}
}

4.总结

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

相关文章:

  • 计算机视觉 了解OpenCV、COLMAP、PyTorch3D 和 OpenGL 中坐标系3D转换的简要指南
  • 如何搭建Nacos集群
  • 刷题DAY9 | LeetCode 28-实现 strStr() 459-重复的子字符串
  • Golang 程序启动原理详解
  • shadertoy 游戏《来自星尘》摇杆复刻
  • tsc : 无法加载文件 C:\Users\Administrat\AppData\Roaming\npm\tsc.ps 1,因为在此系统上禁止运行脚本
  • vmware安装图形版ubuntu(20.4)
  • 【Golang星辰图】探索网络和HTTP的奇妙世界:使用Go语言打造高性能应用
  • 华为配置WLAN高密业务示例
  • 【数据结构】复杂度详解
  • 这里推荐一款unity3d人物动物控制器详细的等学会再写文章
  • 08 OpenCV 腐蚀和膨胀
  • Aws Ec2服务器设置密码登录
  • [DevOps云实践] 彻底删除AWS云资源
  • 【Docker】若依后端项目搭建
  • [译]如何构建服务器端web组件,为何要构建?
  • 30天自制操作系统-2
  • Java应用性能调优
  • JS变量作用域
  • Meteor的表单提交:Form
  • sublime配置文件
  • Web设计流程优化:网页效果图设计新思路
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 我看到的前端
  • 原生 js 实现移动端 Touch 滑动反弹
  • 自动记录MySQL慢查询快照脚本
  • 7行Python代码的人脸识别
  • 从如何停掉 Promise 链说起
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • 交换综合实验一
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • (02)Hive SQL编译成MapReduce任务的过程
  • (6)添加vue-cookie
  • (C++)八皇后问题
  • (WSI分类)WSI分类文献小综述 2024
  • (zhuan) 一些RL的文献(及笔记)
  • (ZT)一个美国文科博士的YardLife
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (十三)Maven插件解析运行机制
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (原創) 物件導向與老子思想 (OO)
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .NET导入Excel数据
  • .NET的数据绑定
  • [ IOS ] iOS-控制器View的创建和生命周期
  • [ vulhub漏洞复现篇 ] Apache Flink目录遍历(CVE-2020-17519)
  • [ 英语 ] 马斯克抱水槽“入主”推特总部中那句 Let that sink in 到底是什么梗?
  • [20171106]配置客户端连接注意.txt
  • [2018][note]用于超快偏振开关和动态光束分裂的all-optical有源THz超表——