Spring中的过滤器和拦截器

news2024/11/13 15:39:19

Spring中的过滤器和拦截器

一、引言

在Spring框架中,过滤器(Filter)和拦截器(Interceptor)是实现请求处理的两种重要机制。它们都基于AOP(面向切面编程)思想,用于在请求的生命周期中插入额外的处理逻辑。过滤器和拦截器虽然有相似之处,但在实现原理、触发时机、使用范围等方面存在明显差异。本文将深入探讨Spring中的过滤器和拦截器,并通过代码示例展示它们的具体应用。

二、过滤器和拦截器的实现与区别

1、过滤器(Filter)的实现

过滤器是基于Servlet规范的一部分,用于在请求进入Servlet之前或响应离开Servlet之后进行拦截处理。在Spring Boot项目中,可以通过实现Filter接口并使用@WebFilter注解来创建过滤器。

1.1、过滤器的代码示例
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

@WebFilter(urlPatterns = "/*")
public class TestFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("过滤器:执行 init 方法。");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("过滤器:开始执行 doFilter 方法。");
        // 请求放行
        filterChain.doFilter(servletRequest, servletResponse);
        System.out.println("过滤器:结束执行 doFilter 方法。");
    }

    @Override
    public void destroy() {
        System.out.println("过滤器:执行 destroy 方法。");
    }
}

2、拦截器(Interceptor)的实现

拦截器是Spring框架提供的一个组件,它基于动态代理实现,可以在请求的多个阶段进行拦截处理,如请求到达Controller之前、之后以及视图渲染之后。

2.1、拦截器的代码示例
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
public class TestInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("拦截器:执行 preHandle 方法。");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("拦截器:执行 postHandle 方法。");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("拦截器:执行 afterCompletion 方法。");
    }
}

三、过滤器和拦截器的区别

在这里插入图片描述

1、实现原理不同

过滤器(Filter)是基于Java Servlet规范的一部分,它的工作原理是函数回调。在过滤器中,doFilter方法是核心,它接收一个FilterChain对象作为参数,这个对象代表过滤器链中的下一个过滤器或目标资源(如Servlet)。通过调用filterChain.doFilter(request, response),过滤器可以控制请求的流动,决定是否将请求传递给下一个过滤器或目标资源。这种机制允许开发者在请求处理的不同阶段插入自定义逻辑,如身份验证、日志记录等。

拦截器(Interceptor)则是Spring框架提供的一个高级功能,它基于Java的动态代理机制实现。拦截器可以拦截进入Controller之前的请求,Controller处理之后的请求,以及响应完成后的处理。拦截器的实现依赖于HandlerInterceptor接口,开发者需要实现该接口的preHandlepostHandleafterCompletion方法。这些方法分别在请求处理的不同阶段被调用,允许开发者在请求的前后插入逻辑,如权限检查、数据预处理等。

2、使用范围不同

过滤器的使用范围受限于Servlet容器,因此它们只能在Web应用程序中使用。过滤器的作用域是整个Web容器,可以对所有的请求进行过滤,包括对静态资源(如图片、CSS、JavaScript文件)的请求。

拦截器的使用范围则更广,因为它是Spring框架的一部分,不依赖于Servlet容器。这意味着拦截器不仅可以在Web应用程序中使用,还可以在任何Spring管理的应用程序中使用,如非Web的Spring应用。这使得拦截器的使用更加灵活,可以跨越不同的应用类型。

3、触发时机不同

过滤器的触发时机是在请求进入Servlet容器后,但在到达具体的Servlet之前,以及在响应离开Servlet容器之后。这意味着过滤器可以在请求被Spring的DispatcherServlet处理之前或之后执行。

拦截器的触发时机则与过滤器不同。拦截器在请求进入Servlet容器后,在到达Controller之前被触发,以及在Controller处理请求之后和响应完成后。这允许拦截器在请求处理的更细粒度的阶段插入逻辑。

4、拦截的请求范围不同

过滤器可以拦截所有进入Servlet容器的请求,包括对静态资源的请求。这意味着过滤器可以用来处理如请求日志、请求限流、请求内容的修改等通用功能。

拦截器主要拦截发送到Controller的请求。由于拦截器是Spring框架的一部分,它们只能拦截那些由Spring MVC的DispatcherServlet处理的请求。这意味着拦截器不能拦截对静态资源的请求,但可以拦截对Controller的请求,这使得拦截器非常适合用于处理与业务逻辑相关的任务,如权限检查、业务日志记录等。

通过这些详细的比较,我们可以更清晰地理解过滤器和拦截器的不同之处,以及它们在实际开发中的适用场景。

四、总结

过滤器和拦截器在Spring框架中扮演着重要的角色,它们提供了灵活的请求处理机制。理解它们的区别和适用场景,可以帮助我们更好地设计和实现Web应用。通过本文的介绍和代码示例,希望能够帮助你在实际开发中正确选择和使用过滤器和拦截器。


版权声明:本博客内容为原创,转载请保留原文链接及作者信息。

参考文章

  • 面试突击90:过滤器和拦截器有什么区别?-腾讯云开发者社区
  • 过滤器 和 拦截器的 6个区别,别再傻傻分不清了_拦截器和过滤器的区别-CSDN博客

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

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

相关文章

Day16二叉树的中序遍历

给定一个二叉树的根节点 root ,返回它的中序遍历 。 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(i…

RT-DETR实战TT100K中国交通标志识别

本文采用RT-DETR作为核心算法框架,结合PyQt5构建用户界面,使用Python3进行开发。RT-DETR以其高效的实时检测能力,在多个目标检测任务中展现出卓越性能。本研究针对TT100K交通标志数据集进行训练和优化,该数据集包含丰富的TT100K交…

图像信号处理器(ISP,Image Signal Processor)详解

简介:个人学习分享,如有错误,欢迎批评指正。 图像信号处理器(ISP,Image Signal Processor) 是专门用于处理图像信号的硬件或处理单元,广泛应用于图像传感器(如 CMOS 或 CCD 传感器&a…

js基础篇笔记 (万字速通)

此笔记来自于黑马程序员,仅供笔者复习 JavaScript 基础 - 第1天 了解变量、数据类型、运算符等基础概念,能够实现数据类型的转换,结合四则运算体会如何编程。 体会现实世界中的事物与计算机的关系理解什么是数据并知道数据的分类理解变量存储数据的“容…

【GPTs】EmojiAI:轻松生成趣味表情翻译

博客主页: [小ᶻZ࿆] 本文专栏: AIGC | GPTs应用实例 文章目录 💯GPTs指令💯前言💯EmojiAI主要功能适用场景优点缺点 💯小结 💯GPTs指令 中文翻译: 此 GPT 的主要角色是为英文文本提供幽默…

H.264/H.265播放器EasyPlayer.js无插件H5播放器关于WASM的压缩优化

在当今的Web开发领域,流媒体播放器的性能和效率至关重要,尤其是在处理大型视频文件和高分辨率视频流时。EasyPlayer.js RTSP播放器作为一款先进的流媒体播放器,它在WebAssembly(WASM)的压缩优化方面表现出色&#xff0…

Unity Shader分段式血条

Unity Shader分段式血条 前言项目ASE连线 前言 要给单位加一个类似LOL的分段式血条,用ASE实现并记录一下。里面加了旋转和颜色的渐变。 项目 ASE连线

基于 STM32 的天气时钟项目中添加天气数据的网络获取功能

基于 STM32 的天气时钟项目中添加天气数据的网络获取功能,您需要确保您的开发环境具备网络连接能力。这里以 ESP8266 Wi-Fi 模块为例,详细说明如何实现网络获取天气数据的功能。 1. 硬件连接 连接 ESP8266 模块 请参考以下连接方式,将 ESP82…

element-plus按需引入报错AutoImport is not a function

官网文档:快速开始 | Element Plus webpack配置 // webpack.config.js const AutoImport require(unplugin-auto-import/webpack) const Components require(unplugin-vue-components/webpack) const { ElementPlusResolver } require(unplugin-vue-components…

MatSci-LLM ——潜力和挑战以及大规模语言模型在材料科学中的应用

概述 大规模语言模型的出现正在从根本上改变技术开发和研究的方式。大规模语言模型不仅对自然语言处理领域产生了重大影响,而且对许多相关领域也产生了重大影响,例如从文本生成图像的计算机视觉(Zhang 等人,2023 年)。…

【系统架构设计师(第2版)】五、软件工程基础知识

5.1 软件工程 20世纪60年代,为了解决软件危机,提出了软件工程的概念。 软件危机的具体表现: 软件开发进度难以预测;软件开发成本难以控制;软件功能难以满足用户期望;软件质量无法保证;软件难以…

C++builder中的人工智能(17):神经网络中的自我规则非单调(Mish)激活函数

在这篇文章中,我们将探讨自我规则非单调激活函数——Mish在神经网络中的应用。了解Mish函数的工作原理,将有助于您在使用C IDE构建C应用程序时更加得心应手。 目录 神经网络中的激活函数是什么?能在C中创建激活函数吗?自我规则非…

华为eNSP实验:IP Source Guard

一:IP Source Guard: IP Source Guard(简称IPSG)是一种基于二层接口的源IP地址过滤技术,用于防止恶意主机伪造合法主机的IP地址进行网络攻击。以下是对IP Source Guard的详细解析: 基本概念: IP Source Gu…

Git进阶(十八):git rebase详解

文章目录 一、前言二、rebase 图解三、应用示例四、重建提交历史五、rebase VS merge六、拓展阅读 一、前言 rebase 使用方法 git rebase [基节点] git rebase [基节点] [待变基节点]rebase后面的参数可以是两个,也可以是一个,当rebase为一个参数的时…

【笔记】扩散模型(九):Imagen 理论与实现

论文链接:Photorealistic Text-to-Image Diffusion Models with Deep Language Understanding 非官方实现:lucidrains/imagen-pytorch Imagen 是 Google Research 的文生图工作,这个工作并没有沿用 Stable Diffusion 的架构,而是级…

华夏风物 3.2.0 | 中国风物志,记录各地特产、美食、风景,旅游吃货必备

华夏风物是一款记录中国各地风物的App,类似于一本中国“风物志”。它记录了各地的特产、美食、风景,为用户提供了一个了解和探索中国文化的窗口。该应用的社区氛围非常真实,用户可以发现许多家乡的特色小吃和传统手艺。许多帖子由当地人发布&…

BIST(Built-in Self-Test,内建自测试)学习笔记

参考资料: 内建自测试(Built-in Self-Test,简称BIST)详解_built in self test-CSDN博客 芯片测试术语 ,片内测试(BIST),ATE测试-CSDN博客 可能是DFT最全面的介绍--BIST - 知乎 (zhihu.com) 汽车功能安全--TC3xx LB…

【Ubuntu24.04】从双系统到虚拟机再到单系统的故事

故事 在大学前期,我使用Ubuntu系统都是为了学习一些命令或者其它Linux的东西,对性能的要求不高,所以选择了虚拟机,后来为了做毕设,选择安装了Ubuntu20.04双系统,因为虚拟机实在带不动,那时我的主…

AntFlow一款开源免费且自主可控的仿钉钉工作流引擎

在现代企业管理中,流程审批的高效性直接影响到工作的流畅度与生产力。最近,我发现了一个非常有趣的项目——AntFlow。这个项目不仅提供了一个灵活且可定制的工作流平台,还能让用户以可视化的方式创建和管理审批流程。 如果你寻找一个快速集成…

科学计算服务器:如何计算算力?如何提升科学研究效率?

在现代科学研究的舞台上,科学计算服务器犹如一位强大的幕后英雄,为复杂科学计算任务的攻克提供着坚实支撑。准确计算其算力并充分发挥优势,对提升科学研究效率意义非凡。 服务器的中央处理器(CPU)计算力。在科学计算服…