【SpringBoot篇】Interceptor拦截器 | 拦截器和过滤器的区别

文章目录

  • 🌹概念
    • ⭐作用
  • 🎄快速入门
    • ⭐入门案例代码实现
  • 🛸拦截路径
  • 🍔拦截器interceptor和过滤器filter的区别
  • 🎆登录校验

在这里插入图片描述

🌹概念

拦截器(Interceptor)是一种软件设计模式,用于在应用程序处理请求或响应时对其进行拦截和修改。拦截器可以在整个应用程序中使用,用于执行跨越多个层的通用任务,如身份验证、授权、缓存、日志记录、性能计量等。

在Web开发中,拦截器通常用于在请求到达控制器之前或响应返回客户端之前对其进行修改。例如,在Spring框架中,可以使用拦截器来实现身份验证和授权检查,记录请求和响应的日志,以及处理全局异常等。

拦截器的工作方式是通过将其注册到应用程序的处理管道中,并在请求或响应传递过程中执行相应的操作。拦截器可以访问请求上下文、响应上下文和处理程序对象,从而允许它们访问和修改请求或响应的属性和状态。拦截器还可以决定是否将请求和响应继续传递到下一个处理程序或终止请求。

总之,拦截器是一种非常有用的设计模式,可以帮助开发人员在应用程序中实现通用的功能,提高代码的可重用性和可维护性。

⭐作用

请添加图片描述

拦截器是一种非常有用的设计模式,它可以在应用程序处理请求或响应时对其进行拦截和修改。以下是拦截器的几个常见用途:

  • 身份验证和授权:拦截器可以用于检查请求是否具有适当的凭据,并根据需要拒绝或允许请求。这使得开发人员能够轻松地实现身份验证和授权功能。
  • 缓存:拦截器可以用于缓存请求或响应数据,以便加快应用程序的性能。例如,在Web应用程序中,可以使用拦截器缓存静态资源,如CSS文件和图像。
  • 日志记录:拦截器可以用于记录请求和响应的详细信息,以便开发人员能够更好地了解应用程序的行为和性能。
  • 性能计量:拦截器可以用于测量应用程序的性能,并识别可能的瓶颈。例如,在Web应用程序中,可以使用拦截器跟踪页面加载时间,并标识慢速查询或资源。
  • 异常处理:拦截器可以用于处理应用程序中的异常情况,并提供友好的错误消息。例如,在Web应用程序中,可以使用拦截器捕获异常并显示自定义错误页面。

🎄快速入门

请添加图片描述

⭐入门案例代码实现

代码脚手架我传到网盘里面了,需要的同学请自取
我用夸克网盘分享了「tlias-web-management」,点击链接即可保存。
链接:https://pan.quark.cn/s/b98922faf182


首先我们创建interceptor类
在这里插入图片描述
写入下面的代码

package com.itheima.interceptor;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 LoginCheckInterceptor implements HandlerInterceptor {@Override //目标资源方法运行前运行 返回true,放行  返回false 拦截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");}
}

在这里插入图片描述


创建配置类
在这里插入图片描述

写入下面的代码

package com.itheima.config;import com.itheima.interceptor.LoginCheckInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration  //表明这个是配置类
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate LoginCheckInterceptor loginCheckInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {//加入拦截器(加入的拦截器就是我们刚刚创建的拦截器)registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**");}
}

在这里插入图片描述

入门案例就完成了

🛸拦截路径

通过配置拦截路径,我们可以设置拦截什么路径,放行什么路径

请添加图片描述

🍔拦截器interceptor和过滤器filter的区别

接口规范不同:过滤器需要实现Filter接口,而拦截器需要实现HanglerInterceptor接口
拦截范围不同:过滤器filter会拦截所有的资源,而Interceptor中会拦截Spring环境的资源
请添加图片描述

🎆登录校验

请添加图片描述

登录操作,我们需要使用LoginCheckFilter类,我们修改一下里面的代码

下面是修改后的代码

package com.itheima.interceptor;import com.itheima.pojo.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@Component
@Slf4j
public class LoginCheckInterceptor implements HandlerInterceptor {@Override //目标资源方法运行前运行 返回true,放行  返回false 拦截public boolean preHandle(HttpServletRequest  req, HttpServletResponse resp, Object handler) throws Exception {//获取请求的urlString url = req.getRequestURL().toString();log.info("请求的url:{}",url);//判断请求url中是否包含有login,如果包含,说明是登录操作,进行放行if(url.contains("login")){log.info("登录操作,放行");return true;}//获取请求头的令牌(token)String jwt=req.getHeader("token");//判断令牌是否存在,如果不存在,返回错误结果(未登录)//hasLength()方法判断字符串是否有长度(是否为空)if (!StringUtils.hasLength(jwt)){log.info("请求头token为空,返回未登录的信息");Result error= Result.error("NOT_LOGIN");//使用阿里巴巴的fastJSON工具包,将对象转成json字符串String notLogin= JSONObject.toJSONString(error);//响应给浏览器resp.getWriter().write(notLogin);return false;}//解析token,如果解析失败,返回登录结果//jwt令牌try {JwtUtils.parseJWT(jwt);}catch (Exception e){e.printStackTrace();log.info("解析token失败,返回未登录的错误信息");Result error= Result.error("NOT_LOGIN");//使用阿里巴巴的fastJSON工具包,将对象转成json字符串String notLogin= JSONObject.toJSONString(error);//响应给浏览器resp.getWriter().write(notLogin);return false;}//放行log.info("令牌合法,放行");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");}
}

在这里插入图片描述

在技术的道路上,我们不断探索、不断前行,不断面对挑战、不断突破自我。科技的发展改变着世界,而我们作为技术人员,也在这个过程中书写着自己的篇章。让我们携手并进,共同努力,开创美好的未来!愿我们在科技的征途上不断奋进,创造出更加美好、更加智能的明天!

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

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

相关文章

蓝桥杯专题-真题版含答案-【祖冲之割圆法】【错误票据】【显示为树形】【汉字相乘】

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分…

【自定义Source、Sink】Flink自定义Source、Sink对ClickHouse进行读和批量写操作

ClickHouse官网文档 Flink 读取 ClickHouse 数据两种驱动 ClickHouse 官方提供Clickhouse JDBC.【建议使用】第3方提供的Clickhouse JDBC. ru.yandex.clickhouse.ClickHouseDriver ru.yandex.clickhouse.ClickHouseDriver.现在是没有维护 ClickHouse 官方提供Clickhouse JDBC…

华为ensp-无线小型wlan配置教程

实验拓扑图: 实验平台:ENSP510 实验设备:Centered Cloud、AC6005、AP4030、STA、Cellphone vlan范围划分 vlan 101 : 10.23.101.1/24 vlan 100 : 10.23.100.1/24实验步骤: 一、创建VLAN100、101配置端口类型 [AC1]vlan batch 100…

STM32启动流程详解(超全,startup_stm32xx.s分析)

单片机上电后执行的第一段代码 1.初始化堆栈指针 SP_initial_sp 2.初始化 PC 指针Reset_Handler 3.初始化中断向量表 4.配置系统时钟 5.调用 C 库函数_main 初始化用户堆栈,然后进入 main 函数。 在正式讲解之前,我们需要了解STM32的启动模式。 STM32的…

【Vue】日期格式化(全局)

系列文章 【Vue】vue增加导航标签 本文链接:https://blog.csdn.net/youcheng_ge/article/details/134965353 【Vue】Element开发笔记 本文链接:https://blog.csdn.net/youcheng_ge/article/details/133947977 【Vue】vue,在Windows IIS平台…

关于“Python”的核心知识点整理大全23

目录 ​编辑 第10 章 文件和异常 10.1 从文件中读取数据 10.1.1 读取整个文件 pi_digits.txt file_reader.py 10.1.2 文件路径 10.1.3 逐行读取 file_reader.py 10.1.4 创建一个包含文件各行内容的列表 10.1.5 使用文件的内容 pi_string.py 往期快速传…

Microsoft visual studio 2013卸载方法

1、问 题 Microsoft visual studio 2013 无法通过【程序与功能】卸载 2、解决方法 使用微软的Microsoft visual studio 2013 专用卸载工具 工具下载链接:https://github.com/Microsoft/VisualStudioUninstaller/releases 或 链接:https://pan.baidu.c…

【自动化测试】web3py 连接 goerli

web3py 连接 goerli 直接使用库里方法 if __name__ __main__:from web3.auto.infura.goerli import w3w3.eth.get_balance(get_address_by_private_key(os.getenv("AAA_KEY")))error info: websockets.exceptions.InvalidStatusCode: server rejected WebSocket …

02-MQ入门之RabbitMQ简单概念说明

二:RabbitMQ 介绍 1.RabbitMQ的概念 RabbitMQ 是一个消息中间件:它接受并转发消息。你可以把它当做一个快递站点,当你要发送一个包裹时,你把你的包裹放到快递站,快递员最终会把你的快递送到收件人那里,按…

LeetCode 1143最长公共子序列 1035不相交的线 53最大子序和 | 代码随想录25期训练营day53

动态规划算法11 LeetCode 1143 最长公共子序列 2023.12.16 题目链接代码随想录讲解[链接] int longestCommonSubsequence(string text1, string text2) {//1确定dp二维数组&#xff0c;dp[i][j]表示以text1[i-1]、text2[j-1]结尾相同的公共子序列的最大长度vector<vecto…

普通二叉树和右倾斜二叉树--LeetCode 111题《Minimum Depth of Binary Tree》

本文将以解释计算二叉树的最小深度的思路为例&#xff0c;致力于用简洁易懂的语言详细描述普通二叉树和右倾斜二叉树在计算最小深度时的区别。通过跟随作者了解右倾斜二叉树的概念以及其最小深度计算过程&#xff0c;读者也将对左倾斜二叉树有更深入的了解。这将为解决LeetCode…

BIM 技术:CIM (City Information Modeling) 1-7 级

本心、输入输出、结果 文章目录 BIM 技术&#xff1a;CIM &#xff08;City Information Modeling&#xff09; 1-7 级前言城市信息模型&#xff08;CIM&#xff09;概述城市信息模型分级介绍CIM 1CIM 2CIM 3CIM 4CIM 5CIM 6CIM 7 花有重开日&#xff0c;人无再少年实践是检验真…

【Linux】dump命令使用

dump命令 dump命令用于备份文件系统。使用dump命令可以检查ext2/3/4文件系统上的文件&#xff0c;并确定哪些文件需要备份。这些文件复制到指定的磁盘、磁带或其他存储介质保管。 语法 dump [选项] [目录|文件系统] bash: dump: 未找到命令... 安装dump yum -y install …

TableView复用机制的坑

TableView复用机制的坑 复用机制 UITableView 首先加载能够覆盖一屏幕的 UITableViewCell&#xff08;具体个数要根据每个 cell 的高度而定&#xff09;。 然后当我们往上滑动时&#xff08;往下滑动同理&#xff09;&#xff0c;需要一个新的 cell 放置在列表的下方。此时&…

SpringBoot Starter机制(自定义Start案例,实际开发场景中的短信模拟,AOP实现日志打印)

前言&#xff1a; 在我们上一篇博客中&#xff0c;实现Freemarke的增删改查&#xff0c;今天分享的是关于SpringBoot Starter机制-- 1.SpringBoot Starter 1.1.什么是SpringBoot Starter SpringBoot中的starter是一种非常重要的机制(自动化配置)&#xff0c;能够抛弃以前繁杂…

一款专业的磁盘坏道清除、彻底清除填充数据根据-硬盘数据彻底清除的方法分享

工具提供了硬盘坏道修复功能&#xff0c;你可以将损坏的磁盘放到软件分析&#xff0c;让软件找到错误的地方&#xff0c;让软件找到损坏的区域&#xff0c;通过内置的修复功能就可以将不能正常使用的部分恢复&#xff0c;从而让您的电脑磁盘可以保存很多数据&#xff0c;避免造…

Windows安装Tesseract OCR与Python中使用pytesseract进行文字识别

文章目录 前言一、下载并安装Tesseract OCR二、配置环境变量三、Python中安装使用pytesseract总结 前言 Tesseract OCR是一个开源OCR&#xff08;Optical Character Recognition&#xff09;引擎&#xff0c;用于从图像中提取文本。Pytesseract是Tesseract OCR的Python封装&am…

【python】Debian安装miniconda、spyder、tushare

1. miniconda 安装 — 动手学深度学习 2.0.0 documentation中有安装Miniconda的一些说明。 Miniconda — miniconda documentation是Miniconda网站&#xff0c;里面也有安装说明。 Debian安装按照linux安装即可&#xff1a; mkdir -p ~/miniconda3 wget https://repo.anaco…

macbookpro 2024怎么恢复出厂设置

可能你的MacBook曾经是高性能的代表&#xff0c;但是现在它正慢慢地逝去了自己的光芒&#xff1f;随着逐年的使用以及文件的添加和程序的安装&#xff0c;你的MacBook可能会开始变得迟缓卡顿&#xff0c;或者失却了以往的光彩。如果你发现你的Mac开始出现这些严重问题&#xff…

英语综合教程1第三版的一些题

unit1 unit2 unit3 unit4 unit5 unit6