拦截器详解

一、概述

什么是拦截器?

是一种动态拦截方法调用的机制,类似于过滤器。Spring框架中提供的,用来动态拦截控制方法的执行。

到底是干啥用的?

拦截请求用的,在指定的方法调用前后,执行在拦截器中编写的程序

比如:我们做了一个页面,我们希望在用户登录之后才能访问后面的页面,但是他们可以直接在地址栏中输入 /接口 去访问后面的页面。

所以我们要使用拦截器,在用户直接访问了接口之后,在程序的方法执行前拦截住,检查一下有没有好好的登陆再决定方法是否要执行。

操作步骤

1、定义拦截器

实现HandlerInterceptor接口,并重写其中的所有方法

其中有三个方法需要重写

  • preHandle:在目标方法(接口)执行前拦截住,先执行其中的逻辑后决定是否放行目标方法。返回值 true放行,false不放行
  • postHandle:在目标方法(接口)执行后拦截住,执行其中的逻辑
  • afterCompletion:在试图渲染完毕后拦截住,执行其中的逻辑

你可能会疑问,里面什么数据都没有,我们之前是通过参数声明的方式直接拿到,但是在重写的这个方法中并没有。那怎么在里面验证前后端的数据呢?没错,这是因为数据直接被包含在了这方法里的参数中

  • HttpServletRequest:代表请求,所有的请求数据都在request对象中
  • HttpServletRequest:代表响应,所有的响应数据都在response数据中

而且还在拦截器上加上@Component注解,那么就代表就要交给了IOC容器管理了,此时就变成了一个bean对象。

2、注册拦截器

只有在这里面引入刚才写完的拦截器后,拦截器才会生效。重写其中的addIntercepter方法。顾名思义,就是添加那些拦截器。

注:既然是拦截器,那么它就能拦截所有的接口。一定要注意不能让它拦截登录接口和注册接口,不然要访问数据接口就要登录生成的token,要登陆的token就要访问登录接口,由于登录接口也被拦截了,那么访问登录接口就要登录生成的token,要登录的token就要访问登录接口......开启了无限套娃。因此要使用excludePathPatterns方法排除不需要拦截的接口。


二、拦截详解

拦截路径

执行流程

当我们打开浏览器来访问部署在web服务器上的web应用时,此时过滤器Filter就会拦截到这次请求,然后依次执行 放行前操作,放行,放行后操作。之后就会进入springboot程序 。

        Tomcat服务器是一个servlet容器,只识别servlet程序,不识别controller程序。因此Spring的web环境提供了一个前端控制器DispatcherServlet,请求会先到这里面,DispatcherServlet又会转给Controller,这个过程中会遇到拦截器Interceptor,以此执行preHandle、postHandle、afterCompletion。反过来响应也是如此

过滤器与拦截器的区别

  • 接口规范不同:过滤器需要实现Filter接口,而拦截器需要实现HandlerIntercetor接口
  • 拦截范围不同:过滤器Filter会拦截所有的资源,而拦截器Interceptor会拦只会拦截spring中的资源 

过滤器与拦截器我们只使用其中一个就行了,推荐使用拦截器


三、使用案例

登录校验

@Component
public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //获取令牌
        String token = request.getHeader("Authorization");
        //验证token
        try {
            Map<String,Object> claims = JwtUtil.parseToken(token);

            //将解析的token信息放入ThreadLocal
            ThreadLocalUtil.set(claims);

            //没有异常就放行
            return true;
        } catch (Exception e) {
            //未登录,不放行
            response.setStatus(401);
            return false;
        }

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

        //清空ThreadLocal的数据
        ThreadLocalUtil.remove();
    }
}

在这里补充一个

全局异常处理器

我们在写bug程序的时候,难免会遇到很多bug,通常我们会直接try - catch包裹住方法,然后处理掉。但是这样会让程序显得很臃肿,不方便别人观看。因此我们还是选择直接throw抛出异常让调用者处理。就这样一直抛一直抛,扔到最后,让一个专门的类来做统一处理,这就是全局异常处理。

代码实现

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    public Result handleException(Exception e){
        e.printStackTrace();
        //有的异常可能没有message,所以要先用三元运算符判断一下
        return Result.error(StringUtils
                .hasLength(e.getMessage()) ? e.getMessage() : "操作失败");
    }

}

简单解释一下,

  • @RestControllerAdvice代表这是一个全局异常处理器。
  • @ExceptionHandler()代表你要捕获什么异常,Exception.class代表你要捕获所有的异常,因为Exception是所有异常的父类 

你可能会疑问,我们最后return出去的不是result类吗,前端是怎么接受到json文件呢?

这是因为@RestControllerAdvice = @ControllerAdvice + @ResponesBody

@ResponesBody会将方法的返回值转化为Json

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

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

相关文章

苹果App加急审核

苹果App加急审核 &#xff08;注意加急的次数&#xff0c;有的说一年能加急两次&#xff0c;有的说不止两次。遇到紧急问题了就用&#xff0c;非紧急 等一等也行&#xff09; 1.登录苹果账号 Sign In - Apple &#xff08; https://developer.apple.com/contact/app-store/?…

力扣每日一道系列 --- LeetCode 206. 反转链表

&#x1f4f7; 江池俊&#xff1a; 个人主页 &#x1f525;个人专栏&#xff1a; ✅数据结构探索 ✅LeetCode每日一道 &#x1f305; 有航道的人&#xff0c;再渺小也不会迷途。 LeetCode 206. 反转链表 思路一&#xff1a;头插 初始化两个指针&#xff0c;cur 和 newhead。…

单片机、ARM、嵌入式开发、Android 底层开发有什么关系?

单片机、ARM、嵌入式开发、Android 底层开发有什么关系&#xff1f; 从我目前的见识来看&#xff1a; 单片机是个系统&#xff08;比如&#xff1a;51、AVR、PLC...&#xff09;&#xff0c;其中包含了去除了输入输出之外的运算器、控制器、存储器&#xff0c;我们用程序可以非…

CANdelaStudio 使用教程3 新建Service

文章目录 简述Service 的相关配置项1、Protocol Services2、Diagnostic Class Templates3、Supported Diagnostic Classes 新建 Service1、新建 Service2、新建类并添加服务3、 选择支持的服务4、Diagnostic Class Templates&#xff1a;Identification 编辑 Service1、新增服务…

区块链技术将如何影响未来的数字营销?

你是否听腻了区块链和数字营销等流行语&#xff0c;却不明白它们对未来意味着什么&#xff1f;那么&#xff0c;准备好系好安全带吧&#xff0c;因为区块链技术将彻底改变我们对数字营销的看法。从建立消费者信任到提高透明度和效率&#xff0c;其可能性是无限的。 让我们来探…

有序表的详解

目录 有序表的介绍 树的左旋和右旋操作 AVL树的详解 SB树的详解 红黑树的介绍 SkipList的详解 有序表的介绍 有序表是除具备哈希表所具备的功能外&#xff0c;有序表中的内容都是按照key有序排列的&#xff0c;并且增删改查等操作的时间复杂度都是&#xff0c;红黑树&…

【超强笔记软件】Obsidian如何实现免费无限流量无套路云同步?

【超强笔记软件】Obsidian如何实现免费无限流量无套路云同步&#xff1f; 文章目录 【超强笔记软件】Obsidian如何实现免费无限流量无套路云同步&#xff1f;一、简介软件特色演示&#xff1a; 二、使用免费群晖虚拟机搭建群晖Synology Drive服务&#xff0c;实现局域网同步1 安…

Educational Codeforces Round 158 (Rated for Div. 2)(A~E)(贪心,树形DP)

A - Line Trip 题意&#xff1a;有一条路&#xff0c;可以用一条数线来表示。你位于数线上的点 0 &#xff0c;你想从点 0 到点 x &#xff0c;再回到点 0。你乘汽车旅行&#xff0c;每行驶 1个单位的距离要花费 1 升汽油。当您从点 0出发时&#xff0c;汽车已加满油(油箱中的…

spring boot的自动装配原理

一&#xff1a;简介 SpringBoot 这款框架几乎是现在企业级开发的标配&#xff0c;使用SpringBoot进行开发&#xff0c;能够大量减少xml配置文件的编写&#xff0c;并且能为我们提供一站式服务。SpringBoot我们只需要导入相关模块的starter&#xff0c;就可以使用相关功能&…

深度学习基于Python+TensorFlow+Django的水果识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介简介技术组合系统功能使用流程 二、功能三、系统四. 总结 一项目简介 # 深度学习基于PythonTensorFlowDjango的水果识别系统介绍 简介 该水果识别系统基于…

医保线上购药系统:引领医疗新潮流

在科技的驱动下&#xff0c;医疗健康服务正经历一场数字化的革新。医保线上购药系统&#xff0c;不仅是一种医疗服务的新选择&#xff0c;更是技术代码为我们的健康管理带来的全新可能。本文将通过一些简单的技术代码示例&#xff0c;深入解析医保线上购药系统的工作原理和优势…

C#,《小白学程序》第五课:队列(Queue)其一,排队的技术与算法

日常生活中常见的排队&#xff0c;软件怎么体现呢&#xff1f; 排队的基本原则是&#xff1a;先到先得&#xff0c;先到先吃&#xff0c;先进先出 1 文本格式 /// <summary> /// 《小白学程序》第五课&#xff1a;队列&#xff08;Queue&#xff09; /// 日常生活中常见…

uniapp IOS从打包到上架流程(详细简单) 原创

uniapp打包好的ipa文件&#xff0c;需要上架到appstore&#xff0c;用户才能通过app store下载使用&#xff0c;因此我们需要将ipa上架到appstore. 我们这篇文章&#xff0c;将教会大家使用windows电脑将uniapp打包好的ipa文件&#xff0c;上架到appstore的方法和详细流程。 …

SpectralGPT: Spectral Foundation Model 论文翻译2

遥感领域的通用大模型 2023.11.13在CVPR发表 原文地址&#xff1a;[2311.07113] SpectralGPT: Spectral Foundation Model (arxiv.org) 实验 ​ 在本节中&#xff0c;我们将严格评估我们的SpectralGPT模型的性能&#xff0c;并对其进行基准测试SOTA基础模型&#xff1a;ResN…

C#/.NET/.NET Core推荐学习书籍(已分类)

前言 古人云&#xff1a;“书中自有黄金屋&#xff0c;书中自有颜如玉”&#xff0c;说明了书籍的重要性。作为程序员&#xff0c;我们需要不断学习以提升自己的核心竞争力。以下是一些优秀的C#/.NET/.NET Core相关学习书籍&#xff0c;值得.NET开发者们学习和专研。书籍已分类…

java学习part10 this

90-面向对象(进阶)-关键字this调用属性、方法、构造器_哔哩哔哩_bilibili 1.java的this java的this性质类似cpp的this&#xff0c; 但它是一种引用&#xff0c;所以用 this. xxx来调用。 this代表当前的类的实例&#xff0c;所以必须和某个对象结合起来使用&#xff0c;不能…

elk 简单操作手册

1.1. 基础概念 EFK不是一个软件,而是一套解决方案,开源软件之间的互相配合使用,高效的满足了很多场合的应用,是目前主流的一种日志系统。 EFK是三个开源软件的缩写,分别表示:Elasticsearch , Filebeat, Kibana , 其中Elasticsearch负责日志保存和搜索,Filebeat负责收集日志,Ki…

【开源】基于Vue和SpringBoot的独居老人物资配送系统

项目编号&#xff1a; S 045 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S045&#xff0c;文末获取源码。} 项目编号&#xff1a;S045&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询社区4…

【maven】【IDEA】idea中使用maven编译项目,报错java: 错误: 找不到符号 【2】

idea中使用maven编译项目,报错java: 错误: 找不到符号 错误状况展示: 如果报这种错,是因为项目中真的找不到报错的方法或者枚举 字段之类的,但实际是 : 点击 File Path

上市公司-股权性质数据(国企、央企)2003-2022年

上市公司-股权性质数据&#xff08;国企、央企&#xff09;是一个针对上市公司的数据集&#xff0c;主要涵盖了A股公司股权性质的详细信息&#xff0c;区分了公司是否为民营企业、国企或央企。这份数据集提供了每家上市公司的股权结构背景&#xff0c;对投资者、市场分析师和经…