【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 {
    
    @Autowired
    private LoginCheckInterceptor loginCheckInterceptor;
    @Override
    public 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 {
        
            //获取请求的url
            String 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");
    }
}

在这里插入图片描述

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker构建镜像时空间不足:/var/lib/docker,no space left on device

背景 在一次更新业务服务功能后,重新在服务器上构建微服务镜像,在构建镜像时报错空间不足: /var/lib/docker, no space left on device 赶紧用 df -h 看了下磁盘使用情况,果然, devicemapper 已经满了。。由于需要紧急…

C语言代码实现URL编码

在 Python,只需要导入 urllib.parse,然后使用 quote 函数即可把任意字符串进行 URL 编码 现在使用 C 语言来实现等效的代码,我在网上找到现成的代码,改代码接收命令行输入参数,然后进行 URL 编码并输出: #…

Flask基本用法:一个HelloWorld,搭建服务、发起请求

目录 1、简介 2、安装 3、Flask使用示例 参考 1、简介 官网文档 Flask是一个轻量的web服务框架,我们可以利用它快速搭建一个服务,对外提供接口,其他人可以轻松调用我们的服务。这对算法工程师来说比较关键,我们通常不擅长搞开发…

【Docker四】使用Docker-compose一键部署Wordpress平台

目录 一、YAML 文件格式及编写注意事项(重要) 1、yaml文件使用时注意事项: 2、yaml文件的基本数据结构: 2.1、声明变量(标量。是单个的不可再分的值,类型:字符串,整数&#xff0c…

Typescript中Omit数据类型的理解

在 TypeScript 中&#xff0c;Omit 是一个内置的工具类型&#xff0c;它用于从对象类型中排除指定的属性&#xff0c;并返回剩余的属性。 Omit 的语法如下所示&#xff1a; type Omit<T, K> Pick<T, Exclude<keyof T, K>>;其中&#xff0c;T 表示原始类型…

强制性产品认证车辆一致性证书二维码解析

目录 说明 界面 下载 强制性产品认证车辆一致性证书二维码解析 说明 二维码扫描出的信息为&#xff1a; qW0qS6aFjU50pMOqis0WupBnM21DnMxy0dGFN/2Mc9gENXhKh0qEBxFgfXSLoR qW0qS6aFjU50pMOqis0WupBnM21DnMxy0dGFN/2Mc9gENXhKh0qEBxFgfXSLoR 解析后的信息为&#xff1a…

佛山IBM System x3550 M4服务器维修检查

案例背景&#xff1a; 一家位于东莞的制造公司&#xff0c;在其佛山分厂中安装了一台IBM X3550 M4服务器作为其关键业务设备。该服务器负责管理和存储公司的生产数据、ERP系统和供应链数据。在生产过程中&#xff0c;该服务器突然发生了故障&#xff0c;导致佛山分厂的生产中断…

深度学习环境配置

一、Anaconda安装 下载&#xff1a;从清华大学开源软件镜像下载 镜像网址 出现base即为安装成功&#xff1a; 检查显卡的驱动是否正确安装&#xff1a; &#xff08;GPU可以显示出名称&#xff09; GPU0是集显集成显卡是主板自带的显卡。 GPU1是独显即独立显卡&#xff0c…

大数据组件:Hadoop

文章目录 1、Hadoop 是什么2、Hadoop 优势3、Hadoop 组成&#xff08;1&#xff09;HDFS&#xff08;2&#xff09;YARN&#xff08;3&#xff09;MapReduce 架构概述&#xff08;4&#xff09;HDFS、YARN、MapReduce 三者关系&#xff08;5&#xff09;大数据技术生态体系&…

【Java】图片资源转为Base64编码并返回

使用JDK把图片资源转为Base64编码并返回(免费分享&#xff0c;皆可复制粘贴) 在Java实际应用开发过程中&#xff0c;我们需要使用指定的背景图案&#xff0c;例如大型游戏中的一些基本图案&#xff0c;例如礼物、场景、武器造型等等&#xff0c;通俗来说就是图片源文件&#x…

Ubuntu系统的基础操作和使用

#ubuntuUbuntu系统的基础操作和使用包括以下几个方面&#xff1a; 1. 安装和启动&#xff1a;首先&#xff0c;需要下载Ubuntu镜像文件并使用虚拟机软件&#xff08;如VirtualBox&#xff09;创建虚拟机&#xff0c;将镜像文件安装在虚拟机中即可启动Ubuntu系统。 2. 桌面环境…

将开源免费进行到底,ThreadX开源电脑端GUIBuilder图形开发工具GUIX Studio

上个月微软刚刚宣布将ThreadX RTOS全家桶贡献给Eclipse基金会&#xff0c;免费供大家商用&#xff0c;宽松的MIT授权方式&#xff0c;就差这个GUIX Studio没有开源了&#xff0c;而且Windows还经常检索不到&#xff0c;并且也不提供离线包。 1、软件包有点大&#xff0c;700MB…

初识Pandas函数是Python的一个库(继续更新...)

学习网页&#xff1a; Welcome to Python.orghttps://www.python.org/https://www.python.org/https://www.python.org/ Pandas函数库 Pandas是一个Python库&#xff0c;提供了大量的数据结构和数据分析工具&#xff0c;包括DataFrame和Series等。Pandas的函数非常丰富&…

BI技巧丨钻取动态度量值

PowerBI自带的数据钻取功能&#xff0c;在实际应用中是用户使用度较高的功能之一&#xff0c;特别是需要实际操作的业务用户&#xff0c;往往需要根据汇总的结果定位到相关的明细数据&#xff0c;以便进行下一步的流程操作&#xff0c;这种场景下钻取功能显得尤为便利。 关于钻…

掌握魔法绘制图片、PDF剪辑器功能,智能生成AI文章,高效工作从此开始

在这个信息爆炸的时代&#xff0c;如何高效地处理和利用各种文件格式成为了我们日常工作的关键。今天&#xff0c;我们将为您介绍一款强大的工具&#xff0c;它能够智能生成AI文章&#xff0c;高效掌握魔法绘制图片和PDF剪辑器功能&#xff0c;为您的工作带来前所未有的便捷和高…

【送书活动】智能汽车、自动驾驶、车联网的发展趋势和关键技术

文章目录 前言01 《智能汽车》推荐语 02 《SoC底层软件低功耗系统设计与实现》推荐语 03 《SoC设计指南》推荐语 05 《智能汽车网络安全权威指南&#xff08;上册&#xff09;》推荐语 06 《智能汽车网络安全权威指南&#xff08;下册&#xff09;》推荐语 后记赠书活动 前言 …

jmeter,同一线程组内,调用cookie实现接口关联

取cookie方式参考上一篇&#xff1a;jemeter&#xff0c;取“临时重定向的登录接口”响应头中的cookie-CSDN博客 元件结构 登录后要执行的接口为“api/get_event_list/”&#xff0c;在该HTTP请求下创建HTTP信息头管理器&#xff0c;配置如下&#xff1a; 执行测试后&#xff0…

太阳能电池特性测试用太阳光模拟器24H光源

概述 太阳能模拟器是一种在室内模拟太阳光的设备&#xff0c;能够较为准确地模拟太阳辐射的准直性、均匀性和光谱特性。它的基本原理是利用人工光源模拟太阳光辐射&#xff0c;以克服太阳光辐射受环境、时间和气候等因素影响&#xff0c;并且总辐照度不能调节等缺点&#xff0c…

【NSX-T】10. 搭建NSX-T环境 —— 使用 BGP 配置 Tier-0 网关

目录 10.1 创建上行链路网段10.2 创建 Tier-0 网关&#xff08;1&#xff09;设置 Interface 信息&#xff08;2&#xff09;设置 BGP添加 BGP 邻居 &#xff08;3&#xff09;设置 BGP 路由重分发设置路由重新分发 10.3 连接 Tier-0 和 Tier-1 网关10.4 使用网络拓扑验证 Tier…