Spring Boot拦截器与过滤器的区别

news2024/11/25 2:33:39

Spring Boot拦截器与过滤器的区别

在使用Spring Boot开发Web应用程序时,您可能需要在处理请求之前或之后执行某些操作。这些操作可以包括身份验证、日志记录、性能监测等。在这种情况下,您可以使用两种不同的机制:拦截器和过滤器。本文将介绍这两种机制及其区别,并提供一些示例代码来演示如何在Spring Boot中使用它们。

在这里插入图片描述

拦截器

拦截器是一种在请求处理过程中拦截请求的机制。在Spring Boot中,您可以使用拦截器来执行以下操作:

1.在处理请求之前执行某些操作,例如身份验证、请求参数验证等。

2.在处理请求之后执行某些操作,例如处理响应、记录日志等。

拦截器在处理请求时可以访问和修改请求和响应对象。拦截器可以在请求处理之前和之后执行,因此它们可以用于执行各种任务,例如身份验证、请求参数验证、日志记录等。

要创建一个拦截器,您需要创建一个实现HandlerInterceptor接口的类。这个接口定义了三个方法,分别是preHandlepostHandleafterCompletion。这些方法在请求处理过程中分别被调用。

下面是一个使用拦截器实现身份验证的示例代码:

@Component
public class AuthenticationInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //检查用户是否已登录,如果没有登录则重定向到登录页面
        HttpSession session = request.getSession();
        if (session.getAttribute("user") == null) {
            response.sendRedirect("/login");
            return false;
        }
        return true;
    }
}

在上面的代码中,AuthenticationInterceptor类实现了HandlerInterceptor接口,并重写了preHandle方法。在这个方法中,我们检查了用户是否已登录。如果用户没有登录,我们将重定向到登录页面。

您可以在Spring Boot应用程序中使用@WebMvcConfigurer注解将拦截器添加到应用程序中。下面是一个在Spring Boot应用程序中使用拦截器的示例:

@Configuration
public class WebMvcConfigurer implements WebMvcConfigurer {

    @Autowired
    private AuthenticationInterceptor authenticationInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(authenticationInterceptor).addPathPatterns("/secured/**");
    }
}

在上面的代码中,WebMvcConfigurer类实现了WebMvcConfigurer接口,并重写了addInterceptors方法。在这个方法中,我们将AuthenticationInterceptor添加到InterceptorRegistry中,并指定了要拦截的URL路径。

过滤器

过滤器也是一种在请求处理过程中拦截请求的机制。与拦截器不同,过滤器在请求处理之前执行,并且无法访问请求处理之后的响应对象。

在Spring Boot中,您可以使用过滤器来执行以下操作:

1.在处理请求之前执行某些操作,例如解析请求、身份验证等。

2.在处理请求之后执行某些操作,例如处理响应、设置响应头等。

与拦截器不同,过滤器不能访问和修改请求和响应对象。过滤器只能访问和修改请求和响应的头信息。因此,过滤器通常用于执行与请求和响应头相关的任务,例如设置响应头、字符编码、跨域等。

要创建一个过滤器,您需要创建一个实现Filter接口的类。这个接口定义了一个方法doFilter,该方法在请求处理过程中调用。在这个方法中,您可以访问请求和响应对象,以及它们的头信息。

下面是一个使用过滤器实现字符编码的示例代码:

@Component
public class CharacterEncodingFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        chain.doFilter(request, response);
    }
}

在上面的代码中,CharacterEncodingFilter类实现了Filter接口,并重写了doFilter方法。在这个方法中,我们将请求和响应的字符编码设置为UTF-8

您可以在Spring Boot应用程序中使用@WebFilter注解将过滤器添加到应用程序中。下面是一个在Spring Boot应用程序中使用过滤器的示例:

@WebFilter(urlPatterns = "/*")
public class CharacterEncodingFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        chain.doFilter(request, response);
    }
}

在上面的代码中,CharacterEncodingFilter类使用@WebFilter注解将过滤器添加到应用程序中。在这个示例中,我们将过滤器应用于所有URL路径。

拦截器与过滤器的区别

在上面的示例中,我们已经演示了如何在Spring Boot应用程序中使用拦截器和过滤器。现在,让我们来看看它们之间的区别。

1.执行顺序

拦截器在请求处理前后执行,而过滤器只在请求处理前执行。这意味着拦截器可以访问和修改请求和响应对象,而过滤器只能访问和修改请求和响应头信息。

2.作用范围

拦截器只能拦截Spring MVC的请求,而过滤器可以拦截任何类型的请求。这意味着如果您使用Spring Boot开发非Web应用程序,您只能使用过滤器。

3.配置方式

拦截器可以使用@WebMvcConfigurer注解配置,而过滤器需要使用@WebFilter注解配置。这意味着配置拦截器比配置过滤器更简单。

4.访问权限

拦截器可以访问和修改Controller方法和ModelAndView对象,而过滤器不能访问和修改它们。这意味着如果您需要访问或修改Controller方法或ModelAndView对象,您应该使用拦截器。

综上所述,拦截器和过滤器都可以在Spring Boot应用程序中用于执行特定任务。拦截器主要用于访问和修改请求和响应对象,而过滤器主要用于访问和修改请求和响应头信息。根据您的需求,您可以选择使用拦截器或过滤器。如果您只需要访问或修改请求和响应头信息,则应该使用过滤器。如果您需要访问和修改请求和响应对象,或者需要访问和修改Controller方法和ModelAndView对象,则应该使用拦截器。

总结

在本文中,我们介绍了Spring Boot中拦截器和过滤器的区别。拦截器和过滤器都可以在处理请求之前或之后执行某些操作。拦截器可以访问和修改请求和响应对象,而过滤器只能访问和修改请求和响应头信息。拦截器只能拦截Spring MVC的请求,而过滤器可以拦截任何类型的请求。拦截器可以使用@WebMvcConfigurer注解配置,而过滤器需要使用@WebFilter注解配置。

无论您选择使用拦截器还是过滤器,都需要根据您的需求选择合适的机制。在实际开发中,您

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

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

相关文章

Spring Boot如何实现缓存的自动刷新

Spring Boot如何实现缓存的自动刷新 在Web应用程序中,缓存是提高性能的重要手段之一。在Spring Boot应用程序中,我们可以使用Spring Cache来实现缓存功能。然而,当缓存的数据发生变化时,我们可能需要手动刷新缓存,这可…

C语言---分支和循环语句

1、什么是语句 C语言语句可以分为五类: 表达式语句函数调用语句控制语句复合语句空语句 C语言有九种控制语句 可以分成一下三类: 条件判断语句也叫分支语句:if语句,switch语句;循环执行语句:do while语…

基于html+css的图展示100

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

安卓手机使用Termux搭建Hexo个人博客网站【内网穿透公网访问】

文章目录 1. 安装 Hexo2. 安装cpolar内网穿透3. 公网远程访问4. 固定公网地址 转载自cpolar极点云的文章:安卓手机使用Termux搭建Hexo个人博客网站【内网穿透公网访问】 Hexo 是一个用 Nodejs 编写的快速、简洁且高效的博客框架。Hexo 使用 Markdown 解析文章&#…

Ansible基础1——介绍安装、清单文件、配置文件、临时命令参数、常用功能模块

文章目录 一、发展起源1.1 自动化工具对比1.2 Ansible介绍 二、安装流程2.1 安装清单2.2 系统初始化2.3 安装验证 三、清单文件3.1 默认静态清单3.2 自定义静态清单 四、配置文件4.1 优先级4.2 配置参数4.2.1 [defaults]配置4.2.2 [privilege_escalation]配置4.2.3 其他配置 4.…

C++ new delete

可执行程序(进程) 的虚拟地址空间: 内核: 操作系统 栈区:函数的形参,非静态的局部变量,函数现场保护数据等等,栈是向下增长的。 共享库的内存映射区域:用于装载一个共享的动态内存库。用户可使用系统接口创建共享内存,做进程间通…

四足机器人A1目标跟踪

四足机器人A1目标跟踪 前期准备工作1.安装TeamViewer2.将四足机器人所有线连接好3.将四足机器人调至运动模式 运行流程1.开机阶段2.运行阶段 效果展示代码配置 前期准备工作 1.安装TeamViewer 由于外接屏幕损坏,故四足机器人内部配置了TeamViewer,因此…

VM——编写脚本,TCP发送16进制字符串

1、参考: (1)​​​(246条消息) TCP中发送接收16进制数(16进制字符串与字节数组之间的转换)_tcp发送16进制字符串_start_continue的博客-CSDN博客 (2)(246条消息) C#byte String转换_c# byte转…

【网络编程二】UDP与TCP协议你学会了吗~

目录 🌟需要知道 1、什么是网络编程? 2、怎么进行网络编程? 3、TCP与UDP的区别? (面试题) 🌟一、UDP 🌈1、UDP数据报套接字编程 🌈2、实现一个简单的UDP回显服务…

java服务端如何接入WebSocket?

日常工作中,我们都是使用http请求,来进行前后交互,那么我们也会有使用websocket来进行前后交互的时候,那么它俩有什么区别呢? http和websocket区别 WebSocket是双向通信协议,模拟Socket协议,可…

商场内如何导航?有没有在商场用的导航?

商场内如何导航?大家可能都有这种感觉,在商场里逛街时,好像经常容易迷路,无论是找出口还是找电梯,总会把自己搞得晕头转向,“每次逛完商场都要给自己预留半小时找车子,也是醉了。”“在商场迷路…

XR云新未来 | 弹性算力赋能可交互、沉浸式商业实践

据XR市场研究报告显示,全球XR市场规模不断扩大,于2020年已超过100亿美元,预计到2025年规模将达到数百亿美元。XR技术广泛应用于娱乐、教育和企业领域,随着技术的进步,高分辨率显示、实时渲染和眼动追踪等创新技术的应用…

Ubantu docker学习笔记(十一)k8s基本操作

文章目录 一、K8s介绍二、容器编排2.1 部署应用2.2 了解应用2.3 公开暴露应用2.4 扩缩应用2.4 滚动更新 三、Kubernetes 对象 相信大家在前面的安装过程中,我们的k8s已经完成了一个超级具体的安装【是不是还是有点难度】,今天我们就在前面已经安装好的基…

消防安全知识答题活动小程序v4.3.0

消防安全知识答题活动小程序v4.3.0 v4.3.0 1)实现答题倒计时功能 如果让你给一款答题小程序产品制定一个技术方案,比如实现答题倒计时功能,你会怎么做。 通常,我们对于倒计时的普遍认知是设置一个定时器去实现的,在…

0基础学习VR全景平台篇第32章:场景功能-嵌入文字

大家好,欢迎观看蛙色VR官方系列——后台使用课程! 本期为大家带来蛙色VR平台,场景管理模块-嵌入功能文字模块! 功能位置示意 一、本功能将用在哪里? 嵌入功能可对VR全景作品嵌入【图片】【视频】【文字】【标尺】四…

Android平台OpenCV入门

一、导入OpenCV 别忘记把libopencv_java3.so添加进来。 二、初始化 OpenCVLoader.initDebug();三、常用方法 1. CvType 数据类型 以CV_64FC2为例,64指64位,F指浮点数,C指通道,2为2通道。 数值具体类型取值范围CV_8U8 位无符…

5.30-cloud support -learning

文章目录 namespaceaccessNSG(network security group )UDR (User-Defined Routing)Azure Firewall namespace Namespaces are defined at the Kubernetes cluster level, so each namespace is unique throughout the cluster. I…

C语言笔记 | 数据结构入门指南

文章目录 0x00 前言 0x01 百鸡百钱 0x02 借书方案知多少 0x03 持续更新 0x04 参考文献 0x05 总结 0x00 前言 写这篇《C语言笔记 | 数据结构入门指南》主要是为了帮助更多的编程爱好者打开数据结构的大门,同时也是为了自我编程水平能力的提升。在深奥的数据结构…

正交实验进行方差分析

一、案例介绍 想要从某种草药中提取植物酚,利用专业知识发现可能有三个条件会影响植物酚的提取,每个条件有三个水平,想要通过实验,寻找植物酚的最佳提取条件,其中提取植物酚的参考标准为植物酚的含量(案例…

在线原型设计是什么?8款在线原型工具助你高效设计!

原型设计是产品经理、设计师和开发工程师沟通最初的产品设想的重要工具。 在线原型通过云端的方式具象化地呈现产品内容、结构及粗略的布局,说明用户将如何与产品进行交互,搭建了产品经理、设计师和开发工程师沟通的桥梁,帮助产研团队减少信…