拦截器(详解)

拦截器是啥?

拦截器,就是用来拦截请求的,只有满足预设的代码才能访问对应的接口

在获取图书列表的时候,我们写了一个验证session的,只有登录才可以进行操作,但是这个只对获取图书列表生效,我们不只有这一个获取图书列表,我们还有增删改查,总不可能每一个都写一遍吧,那很累了

所以我们把这个共性的代码给抽离出去,变成公用的-拦截器

拦截器

定义拦截器

首先需要实现HandlerInterceptor接口,然后重写里面的方法

需要重写三个接口

Prehandle表示的是在方法执行之前启动的

Posthandle表示的是方法执行之后启动的

Aftercompletion表示的是当画面渲染好之后启动的(不常用)

注册配置拦截器

实现WebMvcConfigurer接⼝,并重写addInterceptors⽅法,在add中加入你之前自定义的拦截器即可,addpath部分加入的是拦截的访问,/**表示全部拦截

拦截

如果改为false,我们访问任何的资源都会被拦截,无法继续执行到下一步,只有是true的时候,才会被允许访问

这里的addpathpatterns表示的是拦截/**表示拦截的所有

Excludepathpatterns表示的是不拦截的

常见的拦截

拦截器执行过程

原本

用户 controller service mapper 数据库

加了拦截器

用户 拦截器 controller service mapper 数据库

加了拦截器,就会在执行controller执行之前,执行prehandle方法,返回false就会被拦截,返回true才可以继续执行

当返回true之后,就会执行posthandle方法,然后再执行aftercompletion方法,然后返回数据

举例

当我设置这个拦截器之后,如果有访问来了,这个时候他需要先经过我的拦截器的prehandle里面的代码,如果验证通过,那么就会可以访问,验证失败就会显示用户未登录

这里负责的是拦截请求的名单,负责把需要拦截的,不拦截的全部记下来,和前面的自定义的拦截器的验证代码进行配合

举例

当未登录去访问内部的东西

被拦截器拦截,只有登录之后获得session才可以对看到数据和对数据进行操作

成功

先登录之后,获得session之后才可以访问内部的资源

总结

拦截器的存在,是为了保护我们后端的安全,同时也是把我们每个部分都需要写的重复验证代码给提取出来,封装,让我们可以直接使用

逻辑

定义拦截器

实现我们自己需要拦截的逻辑

首先需要一个类去继承HandlerInterceptor接⼝,并重写其所有⽅法,这里的方法分为三个,一个是pre(执行代码前),一个是post(执行代码后),一个是after(渲染结束后),只有当pre里面我们写的代码执行成功之后,返回一个true,才会执行其他的下一步操作

注册配置拦截器

使用什么拦截器,拦截什么,什么不拦截

首先需要一个类去实现实现WebMvcConfigurer接⼝,并重写addInterceptors⽅法和excludePathPatterns方法,这里主要就是把你自己实现的拦截器放进来,然后把你要拦截的,放行的写进去,这样自定义的拦截器才知道要拦截什么,什么不拦截

大白话

这两个是相互配合的,一个负责的是验证什么,怎么验证,一个负责的是哪些需要验证,哪些不需要验证

相关推荐
骄马之死1 天前
SpringMVC + SpringBoot 核心知识点总结
java·spring boot·后端
AOwhisky1 天前
MySQL 学习笔记(第四期):SQL 语言之多表查询
linux·运维·网络·数据库·笔记·学习·mysql
小红卒1 天前
mysql之udf提权
数据库·mysql·网络安全
糖果店的幽灵1 天前
Spring AI 从入门到精通-Embedding
人工智能·spring·embedding
郑洁文1 天前
基于Spring Boot的流浪动物救助网站
java·spring boot·后端·毕设·流浪动物救助
Trouvaille ~1 天前
【Redis篇】Redis 哨兵(Sentinel):高可用自动故障转移
数据库·redis·缓存·中间件·sentinel·高可用·哨兵
qfljg1 天前
oracle 迁移到postgres
数据库·oracle
giaz14n9X1 天前
Redis 分布式锁进阶第五十七篇
数据库·redis·分布式
剑神一笑1 天前
Linux ls 命令深度解析:从目录遍历到颜色输出的实现原理
linux·服务器·数据库
Maynor9961 天前
Codex API 网关迁移与流量优化实战
数据库·oracle