拦截器详解

一、概述

什么是拦截器?

是一种动态拦截方法调用的机制,类似于过滤器。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 {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//获取令牌String token = request.getHeader("Authorization");//验证tokentry {Map<String,Object> claims = JwtUtil.parseToken(token);//将解析的token信息放入ThreadLocalThreadLocalUtil.set(claims);//没有异常就放行return true;} catch (Exception e) {//未登录,不放行response.setStatus(401);return false;}}@Overridepublic 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

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

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

相关文章

手机APP-MCP走蓝牙无线遥控智能安全帽~执法记录仪~拍照录像,并可做基础的配置,例如修改服务器IP以及配置WiFi等

手机APP-MCP走蓝牙无线遥控智能安全帽~执法记录仪~拍照录像,并可做基础的配置,例如修改服务器IP以及配置WiFi等 手机APP-MCP走蓝牙无线遥控智能安全帽~执法记录仪~拍照录像,并可做基础的配置,例如修改服务器IP以及配置WiFi等&#xff0c; AIoT万物智联&#xff0c;智能安全帽…

甲烷产生及氧化

温室气体排放被认为是加速气候变化的重要因素&#xff0c;甲烷(CH4)是仅次于二氧化碳(CO2)的重要温室气体&#xff0c;其百年温室效应潜势是CO2的28倍[1-2]。湿地中的CH4由产甲烷古菌在水体底部或沉积层严格厌氧环境下产生并释放进入水体&#xff0c;产生的CH4向上覆水运输过程…

【用unity实现100个游戏之16】Unity程序化生成随机2D地牢游戏1(附项目源码)

文章目录 先看看最终效果前言随机游走算法使用随机游走算法添加地板瓦片1. 新增TilemapVisualizer&#xff0c;用于可视化地图2. 瓦片素材 不运行执行程序化生成地牢方法1. 先简单重构代码2. 新增Editor脚本RandomDungeonGeneratorEditor 将参数保存到可编辑脚本对象&#xff0…

1、postman的安装及使用

一、安装、登录 1.安装 下载地址 2.注册登录&#xff08;保存云服务进度&#xff09; 二、界面介绍 三、执行接口测试页面 请求页签&#xff1a; 1、params&#xff1a;当是get请求时&#xff0c;通过params传参 2、authorization&#xff1a;鉴权 3、headers&#xff1…

区块链技术与应用 【全国职业院校技能大赛国赛题目解析】第四套区块链应用后端开发

第四套区块链应用后端开发 环境 : ubuntu20 fisco : 2.8.0 springboot 2.1.1 fisco-java-sdk: 2.7.2 maven 3.8.8 前言 这套后端样题,只涉及调用fisco的系统接口,不涉及此食品溯源项目的业务接口,所以我就直接生成一个springboot项目进行完成此题目。 请提前准备好一…

Web自动化测试:测试用例断言!

运行测试用例时&#xff0c;需要判断用例是否执行成功&#xff0c;此时需要有一个我们期望的结果来进行验证。这里unittest中&#xff0c;如果一个case执行的过程中报错&#xff0c;或者我们判断结果不符合期望&#xff0c;就会判定此条用例执行失败&#xff0c;判断的条件主要…

初识Linux(1),看了这篇文章,妈妈再也不用担心我Linux找不到门了。

文章目录 前言1. ls 指令例如&#xff1a;只显示文件名属性ls显示文件详细属性 ls - l 该操作可以简写成ll查看隐藏文件ls -l -a 2.pwd例如&#xff1a;显示当前目录所处的路径类似于windows如下操作: 3.cd 指令例如&#xff1a;改变工作目录相当于windows如下操作 4.whoami 指…

C#,《小白学程序》第一课:初识程序,变量,数据与显示

曰&#xff1a;扫地僧练就绝世武功的目的是为了扫地更干净。 1 引言 编程只是一项技术&#xff0c;如包包子&#xff0c;不是什么高深的科学。 学习程序最不好的方法是先学习枯燥的语法。 学习程序主要是用代码解决问题。因此&#xff0c;我们抛开所有的语法与诸多废物&…

CS5511规格书|CS5511方案应用说明|DP转双路LVDS/eDP芯片方案

概述&#xff1a;CS5511是一个将DP/eDP输入转换为LVDS信号的桥接芯片&#xff0c;此外&#xff0c;CS5511可以用作在DP/eDP输入到DP/eDP输出场景中桥接芯片。CS5511的高级接收器支持VEDA DisplayPort&#xff08;DP&#xff09;1.3和嵌入式DisplayPort&#xff08;eDP&#xf…

springboot+vue基本微信小程序的外卖点餐平台系统

项目介绍 餐饮行业是一个传统的行业。根据当前发展现状&#xff0c;网络信息时代的全面普及&#xff0c;餐饮行业也在发生着变化&#xff0c;单就点餐这一方面&#xff0c;利用手机点单正在逐步进入人们的生活。传统的点餐方式&#xff0c;不仅会耗费大量的人力、时间&#xf…

最新Midjourney绘画提示词Prompt教程无需魔法

最新Midjourney绘画提示词Prompt教程无需魔法使用 一、AI绘画工具 SparkAi【无需魔法使用】&#xff1a; SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧&#xff01;本系统使用NestjsVueTypes…

人工智能-注意力机制之注意力提示

注意力提示 自经济学研究稀缺资源分配以来&#xff0c;人们正处在“注意力经济”时代&#xff0c; 即人类的注意力被视为可以交换的、有限的、有价值的且稀缺的商品。 许多商业模式也被开发出来去利用这一点&#xff1a; 在音乐或视频流媒体服务上&#xff0c;人们要么消耗注意…