【Spring Boot】拦截器学习笔记

news2024/11/27 0:39:02

一、普通拦截器

1,新建类MyWebConfig实现WebMvcConfigurer,实现addInterceptors方法

	@Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry
                // 不拦截哪些请求
                .excludePathPatterns("/login")
                // 拦截哪些请求
                .addPathPatterns("/location/**");
    }

经简单测试,默认是拦截所有,只有加了excludePathPatterns中的才不会拦截,该方法是链式的,可多次使用,参数也可以是多个,类似如下代码

 				// 不拦截哪些请求
                .excludePathPatterns("/bb/**")
                .excludePathPatterns("/aa/**","/scity/**");

2,新建配置类MyInterceptor实现HandlerInterceptor,同时MyWebConfig类里要加入@Bean注解和配置

	// 添加配置
	.addInterceptor(interceptor())
	
    @Bean
    public MyInterceptor interceptor() {
        return  new MyInterceptor();
    }

MyInterceptor里处理拦截需求,实现preHandle方法

   @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
	 		String appId = request.getHeader("appId");
            boolean result = myComp.check(appId);
            if (result) {
                log.info("通过拦截器");
                return true;
            }
            setError(response,new ResponseData(1,"appId有误"));
}

此处的check方法就是获取application.properties中的appId去和请求头中的appId比较,相同则通过,不同则报错
3,新建一个Controller测试拦截器效果

@Slf4j
@RestController
@RequestMapping("/aa")
public class AAController {

 
    @PostMapping("/info")
    public String info(@RequestBody Object requestEntity) {
        String content = "aaa"+ JSON.toJSONString(requestEntity);
        log.info(content);
        return content;
    }

}

在这里插入图片描述
如果填了appId并且appId是正确的,那就可以返回正确的结果
在这里插入图片描述

二、带签名的拦截器

1,思路:拦截器中除了常规的appId外,还加了一个sign参数,这个参数的生成规则是:使用url+body+key方式组合生成sha1签名,匹配前端接口header里的sign,可以做到防止请求被篡改。
核心在于key,这个key是两方协商好的,这个key并不会在网络上传输,不可能被拦截到,除非人为透露。
再严格一点可以加个时间戳

2,修改preHandle方法,获取url、body,生成签名

		// 获取接口地址
        String url = request.getRequestURL().toString();
        // 获取请求体 有待优化
        byte[] bodyBytes = StreamUtils.copyToByteArray(request.getInputStream());
        String body = new String(bodyBytes, request.getCharacterEncoding());
        // 签名前字符串,key=123456,可以是其他任意字符,和调用方约定好就行,该值无法被拦截到
        String sourceStr = url + body + "123456";
        // MD5签名
        String res = DigestUtils.md5DigestAsHex(sourceStr.getBytes(StandardCharsets.UTF_8));
        log.info(res);

3,比对sign

		// 获取Header中sign进行比对
        String sign = request.getHeader("sign");
        if (res.equals(sign)) {
         	log.info("通过拦截器");
		}else{
		 	setError(response, "sign有误");
		}

4,在postman调用测试接口,报错如下

Resolved [org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing: public java.lang.String cn.xmliu.demo.controller.AAController.info(java.lang.Object)]

问题原因主要就是request.getInputStram()在拦截器中已经取过了,到接口时数据已经丢失

解决方法1:去掉@ResponseBody注解或设置为false
解决方法2:增加body封装类,增加过滤器,启动类加bean,修改拦截器

三,参考博文

1,Required request body is missing
2,springboot拦截器校验或鉴权导致Required request body is missing解决方法
3,request.getinputstream只能读取一次

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

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

相关文章

Langchain 大型复杂结构文档解析-识别目录和页码

简介 在文档处理时,尤其是大型复杂结构的文档时,按照字数进行分割,总会造成文本段的割裂,导致召回准确率降低 如果能精确的找到文档大纲和目录,从而按照文档的目录的大纲进行处理,则会提升更多的召回准确…

构建工具Webpack简介

一、构建工具 当我们习惯了Node中使用ES模块化编写代码以后,用原生的HTML、CSS、JS这些东西会感觉到各种不便。比如:不能放心的使用模块化规范(浏览器兼容性问题)、即使可以使用模块化规范也会面临模块过多时的加载问题。 这时候…

小谈设计模式(5)—开放封闭原则

小谈设计模式(5)—开放封闭原则 专栏介绍专栏地址专栏介绍 开放封闭原则核心思想关键词概括扩展封闭 解释抽象和接口多态 代码示例代码解释 优缺点优点可扩展性可维护性可复用性高内聚低耦合 缺点抽象设计的复杂性需要预留扩展点可能引入过度设计 总结 专…

滚雪球学Java(39):学会Java异常处理,让你的程序健壮无比

🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!&#xf…

机器视觉-标定篇

3D结构光标定 结构光视觉的优点: 非接触、信息量大、测精度高、抗干扰能力强。 结构光视觉传感器参数的标定包括:摄像机参数标定、结构光平面参数标定。 结构光视觉测量原理图 我们不考虑镜头的畸变,将相机的成像模型简化为小孔成像模型…

html中图片、音乐、视频标签及选择器、背景

目录 图片 音乐 视频 子代选择器 交集选择器 背景 文章主要补充之前html文章一些漏洞&#xff1a;HTML常用标签表格表单_小俱的一步步的博客-CSDN博客 在VScode中新创建html文件&#xff0c;&#xff01;“Tab”键&#xff0c;自动生成html骨架 图片 <img src"…

Android T 禁止应用添加窗口的操作

序 什么情况下会出现我们需要禁止应用添加窗口的情况呢&#xff1f; 假如有一个应用的窗口&#xff0c;我们点开后是透明的或者会影响到系统的使用&#xff0c;那么我们就有必要对这个窗口操作一下 回顾我们在Android T WMS窗口相关流程中所讲的内容 禁止应用添加窗口的操作…

leetcode题目分析(一)leetcode155最小栈

一、前言 本题基于leetcode155最小栈这道题&#xff0c;说一下通过java解决的一些方法。 需要尤其注意的是&#xff0c;此题输入的值的区间范围在-2^31 < val < 2^31 - 1.这将会影响我们最后一种最优解的结果出现问题。这些都是后话。 二、解决思路 其实在一开始的提交…

vue-cli vue3

安装 cli npm i -g vue/cli4.5.13查看版本&#xff1a;vue -V升级版本&#xff1a;npm update -g vue/cli 升级 在 v 3.0.0 版本中是不支持的最新的 script setup 语法执行指令升级&#xff1a; npm i vue3.2.8 vue-router4.0.11 vuex4.0.2 "vue": "^3.2.8&q…

方案:AI赋能,森林防火可视化智能监管与风险预警系统解决方案

一、方案背景 森林火灾是世界八大自然灾害之一&#xff0c;具有发生面广、突发性强、破坏性大、危险性高、处置扑救特别困难等特点&#xff0c;严重危及人民生命财产和森林资源安全&#xff0c;甚至引发生态灾难。有效预防和及时控制森林火灾是保护国家生态建设成果、推进生态…

SOLIDWORKS三维剖视图怎么做

1.SOLIDWORKS一般剖视图制作方法&#xff0c; a.先选择剖面视图命令制作&#xff08;常用&#xff09; b.先绘制剖切线制作剖视图&#xff0c;绘制剖切线—选择剖面视图命令 2.SOLIDWORKS剖面线的调整。当对默认剖面线不满意时&#xff0c;可以双击剖面线对剖面线进行调整调整 …

Qt重写QTreeWidget实现拖拽

介绍 此文章记录QTreeWidget的重写进度&#xff0c;暂时停滞使用&#xff0c;重写了QTreeWidget的拖拽功能&#xff0c;和绘制功能&#xff0c;自定义了数据结构&#xff0c;增加复制&#xff0c;粘贴&#xff0c;删除&#xff0c;准备实现动态刷新数据支持千万数据动态刷新&a…

Postman应用——Pre-request Script和Test Script脚本介绍

文章目录 Pre-request Script所在位置CollectionFolderRequest Test Script所在位置CollectionFolderRequest Pre-request Script&#xff08;前置脚本&#xff09;&#xff1a;可以使用在Collection、Folder和Request中&#xff0c;并在Request请求之前执行&#xff0c;可用于…

整站抓取的神器

整站抓取的神器 TeleportUltraWebZipMihov Picture DownloaderWinHTTrack HTTrackMaxprogWebDumper 五款整站抓取的工具 TeleportUltra Teleport Ultra所能做的&#xff0c;不仅仅是离线浏览某个网页(让你离线快速浏览某个网页的内容当然是它的一项重要功能)&#xff0c;它可…

链表oj题2(Leetcode)(牛客)——合并两个有序链表;判断回文链表;链表分割

链表oj题2&#xff08;Leetcode&#xff09;&#xff08;牛客&#xff09; 一&#xff0c;合并两个有序链表1.1分析2.2代码 二&#xff0c;链表的回文结构2.1分析2.2代码 三&#xff0c;链表分割3.1分析3.2代码 四&#xff0c;小结 一&#xff0c;合并两个有序链表 合并两个有…

vue的工程化开发全流程,以及开发中的细节语法和用法

vue的工程化开发全流程 文章目录 vue的工程化开发全流程1、工程化开发&脚手架Vue CLI1.1、前言1.2、脚手架Vue CLI1.3、脚手架目录文件介绍&项目运行流程1.4、组件化开发&根组件1.5、普通组件的注册使用 2、工程化开发细则2.1、组件的三大组成部分2.2、组件的样式冲…

yolov8在设置amp=False 之后map 训练依旧为0 解决办法

可能原因 是cuda 版本导致的半精度浮点数计算出现nan的bug 解决办法 设置ampFalse 就是不使用混合精度训练。或者直接改用低版本的cuda和pytorch。cuda11.6 以下 直接有效也有可能是学习率过高 降低学习率 设置ampFalse之后还是存在问题 是因为yolov8库的问题 按以下修改 找到…

RKDevTool打包成update.img

(1) 准备好RKDevTool_Release和rockdev目录相关的文件工具 (2) 在rockdev建立image目录 (3) 往image填入和package-file有关的img文件 (4) 运行需要的xxx_mkupdate文件,直到生成想要的update.img (5) 导入烧录工具,文件大,需要等待一段时间,进入MASKROM模式,点击烧录upd…

我只是个小市民——经受不住宏大叙事

我只是个小市民 ——经受不住宏大叙事 作日看到一个曾经的朋友在朋友圈晒出了在某地旅游的照片&#xff0c;照片清新动人&#xff0c;狠狠地打入了我的内心&#xff0c;我知道光靠手机是拍不出来这样唯美的画面的&#xff0c;于是我问她是如何弄出这么好看的照片&#xff0c;…

淘宝商品sku数据接口监控

淘宝商品sku数据接口监控是指通过API接口对淘宝店铺的商品库存、价格、销售量等数据进行实时监控&#xff0c;以便商家能够及时调整销售策略、优化库存、了解竞争对手的动态等。 监控的具体功能包括&#xff1a; 实时监控商品库存和价格变化&#xff0c;及时调整自己的销售策…