后端获取请求体Body,将请求体进行解密放回Request请求,并能通过@RequestBody获取

目前系统发送的post和put请求都是没有加密数据。客户需要将请求体加密。而系统已经基本开发完成,不可能一个一个去修改发送的请求。就需要在发送请求时候在拦截器中将body进行加密。并且在后端进行请求过滤解密,并且能通过@RequestBody继续获取对象。

1.先将前端代码进行处理。在发送请求时候判断是是否是post或者是put请求,如果是就将body进行加密(本人测试用的是base64)。然后转成json格式传递(如果不转成json,而是直接用base64,就需要修改请求headers,改成"Content-Type":"application/base64"的这种格式,不然后端获取不到body。如果是用application/base64,后端在解密后还需要将请求头改成"Content-Type", "application/json")。

2.后端创建一个过滤器并注册过滤器。这里需要注意一下,当我们获取到加密请求体后,实际的body已经被消费掉了。需要通过filterChain.doFilter(new DecryptingHttpServletRequestWrapper(request, decryptedData), response);这行代码将我们解密后的数据放回请求体

package cn.com.oceansoft.osc.ms.config;import cn.com.oceansoft.osc.ms.common.utils.StringUtils;
import com.alibaba.fastjson.JSON;
import org.springframework.web.filter.OncePerRequestFilter;import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.Base64;/*** @author */
public class DecryptingOncePerRequestFilter extends OncePerRequestFilter {@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)throws ServletException, IOException {if ("POST".equalsIgnoreCase(request.getMethod()) || "PUT".equalsIgnoreCase(request.getMethod())) {// 读取加密的请求体数据String encryptedData = readRequestBody(request);if (StringUtils.isNotBlank(encryptedData)) {//获取到加密的数据String val=(String) JSON.parseObject(encryptedData).get("encryptedData");// Base64解码String decryptedData =decrypt(val);// 使用自定义的请求包装器替换原始请求filterChain.doFilter(new DecryptingHttpServletRequestWrapper(request, decryptedData), response);}} else {// 对于非POST请求,继续过滤器链filterChain.doFilter(request, response);}}private String readRequestBody(HttpServletRequest request) throws IOException {StringBuilder stringBuilder = new StringBuilder();try (BufferedReader reader = request.getReader()) {String line;while ((line = reader.readLine()) != null) {stringBuilder.append(line);}}return stringBuilder.toString();}private String decrypt(String encryptedData) throws UnsupportedEncodingException {// 实现你的解密逻辑// 这里只是一个示例,需要替换为实际的解密方法return new String(Base64.getDecoder().decode(encryptedData), "UTF-8");}// 自定义的请求包装器static class DecryptingHttpServletRequestWrapper extends HttpServletRequestWrapper {private final String decryptedData;public DecryptingHttpServletRequestWrapper(HttpServletRequest request, String decryptedData) {super(request);this.decryptedData = decryptedData;}@Overridepublic ServletInputStream getInputStream() throws IOException {final ByteArrayInputStream bais = new ByteArrayInputStream(decryptedData.getBytes("UTF-8"));return new ServletInputStream() {@Overridepublic boolean isFinished() {return false;}@Overridepublic boolean isReady() {return false;}@Overridepublic void setReadListener(ReadListener listener) {}@Overridepublic int read() throws IOException {return bais.read();}};}@Overridepublic BufferedReader getReader() throws IOException {return new BufferedReader(new InputStreamReader(getInputStream()));}}
}
package cn.com.oceansoft.osc.ms.config;import cn.com.oceansoft.osc.ms.config.DecryptingOncePerRequestFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.servlet.Filter;/*** @author */
@Configuration
public class FilterConfig {@Beanpublic FilterRegistrationBean decryptingFilterRegistration() {FilterRegistrationBean registrationBean =new FilterRegistrationBean();//注册过滤器registrationBean.setFilter(new DecryptingOncePerRequestFilter());registrationBean.addUrlPatterns("/*"); // 设置过滤器应用的URL模式registrationBean.setOrder(1); // 设置过滤器的顺序return registrationBean;}
}

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

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

相关文章

matlab学习004-使用matlab绘制两个序列及信号的卷积波形图

目录 1,序列:x(n)u(n-2)-u(n-10),h(n)((0.9)^n)*u(n) 1)前期基础 ①conv函数 ②离散单位阶跃信号 2)波形图 3)代码 ①使用input方法 ②代码改进【推荐使用】 2,信号:xu(…

C语言趣味代码(二)

1.珠玑妙算 1.1 介绍 《珠玑妙算》(Mastermind)是英国Invicta公司于1973年开始销售的一款益智游戏,据说迄今为止已经在全世界销售了5000万套。《珠玑妙算》于1974年获奖后,在1975年传入美国,1976年leslieH.Autl博士甚至还出版了一本名为The…

去雾笔记01-SRKTDN: Applying Super Resolution Method to Dehazing Task

文章目录 Abstract1. Introduction2. Related Work3. Method3.1. Network Architecture Abstract 们提出了一种结合超分辨方法和知识转移方法的模型。我们的模型由一个教师网络、一个去雾网络和一个超分辨率网络组成。 1. Introduction ECNU KT团队提出了一个知识蒸馏[20]模…

智慧养老平台|基于SprinBoot+vue的智慧养老平台系统(源码+数据库+文档)

智慧养老平台目录 基于SprinBootvue的外贸平台系统 一、前言 二、系统设计 三、系统功能设计 前台 后台 管理员功能 老人功能 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码农…

控制台程序设置

该篇博客主要是对下一篇博客《贪吃蛇游戏》的设计做铺垫,大家可以持续关注(点个关注哦😊)等待更新,以下是个人主页: 敲上瘾-CSDN博客 在我们写的程序运行起来后弹出的框就是控制台程序。而这个窗口我们是可以对它进行设置的&…

终于找到恢复照片的绝佳方法了!手机照片恢复的看这里!

当今手机已经彻底离不开我们的生活,手机里面的数据也成为了我们高质量生活的重要构成,当手机内存爆满,我们就不得不采用清除部分手机数据的方法来释放空间。有一些数据删除后往往才发现还另有用处,比如手机里存储着的大量照片。 …

帆软报表实现通过js查询数据库设置表格数据

最近做的一直在做报表相关的需求,自己也是一边学一边做。有一个有意思的需求是在表格中某个单元格在编辑完以后其它的表格中的数据自动填充,当也是根据一定的规则与数据来源才能填充的。 先来点基础概念,就是帆软给我们提供了这个编辑后的事件…

学习笔记:Vue2高级篇

Vue2 学习笔记:Vue2基础篇_ljtxy.love的博客-CSDN博客学习笔记:Vue2中级篇_ljtxy.love的博客-CSDN博客学习笔记:Vue2高级篇_ljtxy.love的博客-CSDN博客 Vue3 学习笔记:Vue3_ljtxy.love的博客)-CSDN博客 文章目录 7.…

《Spring》系列文章目录

Spring Framework是一个为基于Java的现代企业应用程序提供全面编程和配置模型的开源框架。它集成了控制反转(IOC)、依赖注入(DI)和面向切面编程(AOP)等容器技术。Spring框架的设计理念是面向Bean编程&#…

现代图形API综合比较:Vulkan | DirectX | Metal | WebGPU

Vulkan、DirectX、Metal 和 WebGPU 等低级图形 API 正在融合为类似于当前 GPU 构建方式的模型。 图形处理单元 (GPU) 是异步计算单元,可以处理大量数据,例如复杂的网格几何形状、图像纹理、输出帧缓冲区、变换矩阵或你想要计算的任何数据。 NSDT工具推荐…

早期javeweb技术 JSP JDBC JSTJ Servlet BooStrap

你好,我是Qiuner. 为记录自己编程学习过程和帮助别人少走弯路而写博客 这是我的 github gitee 如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 😄 (^ ~ ^) 想看更多 那就点个关注吧 我会尽力带来有趣的内容 jar包放在web-web-inf中 Boot strap框架 container是两…

【Go语言快速上手(三)】数组, 切片与映射

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:Go语言专栏⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习更多Go语言知识   🔝🔝 GO快速上手 1. 前言2. 数组详解3. 切…

平面设计简介:快速了解

在互联网飞速发展的时代,平面设计仍然是很多设计师的职业选择,平面设计也被称为设计的启蒙星。平面设计是什么,无论是想转行进入平面设计行业还是平面设计新秀?什么是平面设计?只有了解这一点,我们才能在未…

制造业信息安全实践——企业信息安全运营规划

前言 制造业作为一个庞大的传统产业,涵盖了汽车、船舶、飞机、家电、新能源等众多领域。当前,无论是国内还是国外的制造业都面临着一个共同的挑战:在计算机和信息时代的背景下,如何跟上IT技术的发展步伐?如何让传统产…

4月21日Linux运维用户相关的添加,分组,修改权限等shell脚本开发第一天

4月21日运维用户相关的添加,分组,修改权限等shell脚本开发第一天 第一天主要实现前2个功能 ​ 主要卡在了: 正确的写法如下,注意[]中的空格,要求很严格!!! #!/bin/bash # 先查看已…

抖音ip地址怎么换位置

抖音,作为一款短视频分享平台,已经成为了许多人展示生活、分享才艺的重要舞台。然而,在抖音的使用过程中,你是否想过更换自己的IP地址位置呢?更换IP地址不仅可以帮助你访问一些地域限制的内容,还可以为你的…

micro-app的css样式隔离

手写微前端micro-app-CSS隔离 子应用的CSS可能会对基座应用或者其他子应用产生的影响 首先现在我们把react页面放入到vue2的页面大家也能看到一些问题了,在react中的index.css中对body的一些css样式,已经影响了基座应用的css。 为了看的更明显&#x…

RabbitMQ学习记录

核心概念 Brocker:消息队列服务器实体 Exchange(消息交换机):它指定消息按什么规则,路由到哪个队列。 Queue(消息队列载体):每个消息都会被投入到一个或多个队列。 Binding(绑定):它的作用就是把exchange和queue按…

提示框增加HTML效果

预期效果&#xff1a;this.$modal.confirm(是否确认删除该条基础设施数据项&#xff1f;请注意删除该路口基础设施点位将并带删除点位下的所有设施)将两句话换行显示且第二句话字体变为红色 官方案例&#xff1a; this.$alert(<strong>这是 <i>HTML</i> 片段…

【团体程序设计天梯赛】L2-052 吉利矩阵

思路&#xff1a; 直接回溯枚举每一个位置填的数&#xff0c;二维肯定是不方便的&#xff0c;我们转成一维&#xff0c;下标x从0到n*n-1。二维数组下标从0到n-1&#xff0c;在一维中下标为x的点在二维中对应行是x/n&#xff0c;列是x%n。 每个数最小能填的是0&#xff0c;最大…