【Spring Boot】拦截器学习笔记

一、普通拦截器

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

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

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

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

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

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

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

   @Overridepublic 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.rhkb.cn/news/138597.html

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

相关文章

D1117内置热保护和电流限制保护功能,输出电流能力为 1.0A,应用于计算机主板和显卡电源管理等产品上

D1117 是一款低压差线性稳压电路,该电路输出电流能力为 1.0A。该系列电路包含固定输出电压版本和可调输出电压版本, 其输出电压精度为1.5% 。为了保证芯片和电源系统的稳定性,D1117 内置热保护和电流限制保护功能,同时产品采用了…

【前端知识】Three 学习日志(七)—— 动画渲染循环

Three 学习日志(七)—— 动画渲染循环 一、旋转动画 // 渲染函数 function render() {renderer.render(scene, camera); //执行渲染操作mesh.rotateY(0.01);//每次绕y轴旋转0.01弧度requestAnimationFrame(render);//请求再次执行渲染函数render&#…

Microsoft 网络监控

随着网络的发展和变得越来越复杂,公司比以往任何时候都更需要监控其网络基础设施,因为即使是轻微的系统中断也可能导致重大损失。网络监控工具提供实时数据和网络状态的图形概述。这使您能够准确地了解正在发生的事情,以便您知道需要更改的位…

基于Java的公务员考试资料共享平台的设计与实现

前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 👇🏻…

vue管理系统列表行按钮过多, 封装更多组件

管理系统table列表操作列, 随着按钮的数量越来越多会不断加宽操作列, 感觉很不好, 对此我封装了这个自动把多余的按钮放到更多菜单下 MoreOperation/index.vue menu组件我这是ant的, 可以自行替换为其他框架的 <template><div class"table-operations-group"…

CSS 实现祥云纹理背景

&#x1fab4; 背景 最近掘金出来一个中秋创意活动&#xff0c;我准备参加一下。作品方向选择用纯css做一个中秋贺卡&#xff0c;其中有一些中秋的元素和一些简单的动画&#xff0c;而贺卡背景的实现就是本文要讲的内容。 中秋贺卡成果图&#xff08;生成gif有点失真&#x1f6…

网站有反爬机制就爬不了数据?那是你不会【反】反爬

目录 前言 一、什么是代理IP 二、使用代理IP反反爬 1.获取代理IP 2.设置代理IP 3.验证代理IP 4.设置代理池 5.定时更新代理IP 三、反反爬案例 1.分析目标网站 2.爬取目标网站 四、总结 前言 爬虫技术的不断发展&#xff0c;使得许多网站都采取了反爬机制&#xff…

Python150题day08

2.基础语法篇 2.1 if 条件句 ①单个条件分支 使用input函数接收用户的输入&#xff0c;如果用户输入的整数是偶数&#xff0c;则使用print函数输出"你输入的整数是:{value],它是偶数”&#xff0c;[value]部分要替换成用户的输入。 解答: value input("请输⼊⼀…

ESP8266 WiFi物联网智能插座—项目简介

目录 1、项目背景 2、设备节点功能 3、上位机功能 物联网虽然能够使家居设备和系统实现自动化、智能化管理&#xff0c;但是依然需要依靠更为先进的终端插座作为根本保障&#xff0c;插座是所有家用电器需要使用的电源设备&#xff0c;插座的有序智能管理&#xff0c;对于实…

Ubuntu系统下载及安装教程

史上最全最新Ubuntu安装教程&#xff08;图文&#xff09; - 知乎 (说明&#xff1a;本教程介绍的是安装DeskTop版的系统) 1.官网下载镜像 官方网址: https://ubuntu.com/#download进入官网后会有最新版本的镜像下载地址&#xff0c;如果需要下载最新版本&#xff0c;直接点…

Openresty(二十二)ngx.balance和balance_by_lua终结篇

一 灰度发布铺垫 ① init_by_lua* init_by_lua init_by_lua_block 特点: 在openresty start、reload、restart时执行,属于master init 阶段机制&#xff1a; nginx master 主进程加载配置文件时&#xff0c;运行全局Lua VM级别上的参数指定的Lua代码场景&#xff1a; …

SadTalker 让图片说话

参考&#xff1a;https://github.com/OpenTalker/SadTalker 其他类似参考&#xff1a;https://www.d-id.com/ 输入图片加音频产生2d视频 安装使用 1、拉取github&#xff0c;下载对应安装库 2、下载对应模型baidu网盘 新建checkpoints&#xff0c;把下载sadtalker里模型拷贝进…

人源化抗体的改造方式及其优势

抗体是一类能与抗原特异性结合的免疫球蛋白&#xff0c;作为免疫系统中的重要组成部分&#xff0c;在许多疾病的预防和治疗中发挥着重要作用。抗体治疗的最早应用可以追溯到中国人接种“人痘”预防天花的记载算起&#xff0c;国际上一般公认的人痘接种术最早起源于中国公元10世…

基于TensorFlow+CNN+协同过滤算法的智能电影推荐系统——深度学习算法应用(含微信小程序、ipynb工程源码)+MovieLens数据集(六)

目录 前言总体设计系统整体结构图系统流程图 运行环境模块实现1. 模型训练1&#xff09;数据集分析2&#xff09;数据预处理3&#xff09;模型创建4&#xff09;模型训练5&#xff09;获取特征矩阵 2. 后端Django3. 前端微信小程序1&#xff09;小程序全局配置文件2&#xff09…

电容笔有必要买最好的吗?开学好用iPad手写笔推荐

在iPad平板的热卖下&#xff0c;一些学生开始从传统的纸和笔的教学模式转向无纸化教学。因此&#xff0c;原来的Apple Pencil也成了热门话题&#xff0c;不少人都对这款售价近千元的电容笔产生了浓厚的兴趣。我认为对于职业画师来说&#xff0c;这一点非常重要&#xff0c;因为…

开源项目-SeaTunnel-UI数据集成系统

哈喽,大家好,今天给大家带来一个开源项目-SeaTunnel-UI数据集成系统 系统主要有任务配置,任务实例,数据源,虚拟表,用户管理等功能 登录 数据源 mysql数据源配置参数说明 kafka参数配置 mysqlcdc配置参数说明 虚拟表

区块链交易平台开发流程

随着区块链技术的日益发展&#xff0c;越来越多的金融机构和创业公司开始探索开发区块链交易平台的潜力。以下是一篇关于区块链交易平台开发流程的指南。 一、理解区块链技术 在开发区块链交易平台之前&#xff0c;必须深入理解区块链技术的内在机制和原理。区块链是一…

Linux Kernel 之四 移植过程详解、STM32F769I-EVAL 开发板适配

在之前的博文 Linux Kernel 之一 完整嵌入式 Linux 环境、构建工具、编译工具链、CPU 体系架构 中说了要一步步搭建整个嵌入式 Linux 运行环境&#xff0c;今天主要学习一下将 Linux 内核适配 STM32F769I-EVAL 开发板。 源码 文中涉及的源代码均放到了我个人的 Github 上&…

SmartNews 基于 Flink 的 Iceberg 实时数据湖实践

摘要&#xff1a;本文整理自 SmartNews 数据平台架构师 Apache Iceberg Contributor 戢清雨&#xff0c;在 Flink Forward Asia 2022 实时湖仓专场的分享。本篇内容主要分为五个部分&#xff1a; SmartNews 数据湖介绍基于 Icebergv1 格式的数据湖实践基于 Flink 实时更新的数据…

C | atexit函数

C | atexit函数 文章目录 C | atexit函数atexit区别进程终止的方式Reference 欢迎关注公众号“三戒纪元” atexit main函数是整个程序的入口&#xff0c;但是其实可以在内核中可以使用链接器来设置程序的开始地方。 当内核使用⼀个exec函数执行C程序时&#xff0c;在调⽤main…