SpringBoot框架接口数据加密(base64)传输(前后分离版本)

news2024/11/15 11:11:43

技术采用Filter+HttpServletRequestWrapper+HttpServletResponseWrapper+base64

1、前端加解密

        1.1 vue引入开源的base64

1、下载依赖
$ npm install --save js-base64
 
2、使用方法:
import {Base64} from 'js-base64'
 
Base64.encode('hellow world'); // 编码  aGVsbG93IFdvcmxk
Base64.decode('aGVsbG93IFdvcmxk'); // 解码  hellow World

   1.2 在若依系统的request.js中引入base64

         1.3 修改若依系统的request.js中的request拦截器-对config.data进行加密处理

         1.4 修改若依系统的response.js中的响应拦截器-对后端传入的数据进行解密并转成json

2、后端加解密

        2.1 新增过滤器ResponseDataFilter(名字可以随便来,但是要在注册Bean的时候,要统一) 

import com.ruoyi.common.utils.sign.Base64;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;
 
public class ResponseDataFilter implements Filter {
 
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 初始化操作,可留空
    }
 
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest requests =  (HttpServletRequest) request;
        String requestBody = getRequestBody(requests);
        System.out.println(requestBody);
        //解密请求报文
        String requestBodyMw = new String(Base64.decode(requestBody), "utf-8");
        System.out.println("解密请求数据:"+requestBodyMw);
        WrapperedRequest wrapRequest = new WrapperedRequest( (HttpServletRequest) request, requestBodyMw);
        WrapperedResponse wrapResponse = new WrapperedResponse((HttpServletResponse) response);
        chain.doFilter(wrapRequest, wrapResponse);
        byte[] data = wrapResponse.getResponseData();
        System.out.println("原始返回数据: " + new String(data, "utf-8"));
        // 加密返回报文
        String responseBodyMw = Base64.encode(data);
        System.out.println("加密返回数据: " + responseBodyMw);
        response.getOutputStream().write(responseBodyMw.getBytes());
    }
 
    @Override
    public void destroy() {
        // 销毁操作,可留空
    }
 
    private String getRequestBody(HttpServletRequest req) {
        try {
            BufferedReader reader = req.getReader();
            StringBuffer sb = new StringBuffer();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line);
            }
            String json = sb.toString();
            return json;
        } catch (IOException e) {
            System.out.println("请求体读取失败"+e.getMessage());
        }
        return "";
    }
 
 
}

        2.2 把自己添加过滤器注册为bean(在FilterConfig.java文件写,也可以自己写配置文件)

 
  1.  
    @Bean
        public FilterRegistrationBean requestDataFilter()
        {
            FilterRegistrationBean registration = new FilterRegistrationBean();
            //自己的过滤器叫什么名字就写上什么名字
            registration.setFilter(new ResponseDataFilter());
            registration.addUrlPatterns("/*");
            registration.setName("responseDataFilter");
            //过滤器的顺序,数字越小,越先执行,反之亦然
            registration.setOrder(FilterRegistrationBean.LOWEST_PRECEDENCE);
            return registration;
        }

            2.3 继承HttpServletRequestWrapper和继承HttpServletResponseWrapper

     
  2.  
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.OutputStreamWriter;
    import java.io.PrintWriter;
    import java.io.UnsupportedEncodingException;
    import javax.servlet.ServletOutputStream;
    import javax.servlet.WriteListener;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpServletResponseWrapper;
    public class WrapperedResponse extends HttpServletResponseWrapper {
     
        private ByteArrayOutputStream buffer = null;
        private ServletOutputStream out = null;
        private PrintWriter writer = null;
     
        public WrapperedResponse(HttpServletResponse resp) throws IOException {
            super(resp);
            // 真正存储数据的流
            buffer = new ByteArrayOutputStream();
            out = new WapperedOutputStream(buffer);
            writer = new PrintWriter(new OutputStreamWriter(buffer,
                    this.getCharacterEncoding()));
        }
     
        /** 重载父类获取outputstream的方法 */
        @Override
        public ServletOutputStream getOutputStream() throws IOException {
            return out;
        }
     
        /** 重载父类获取writer的方法 */
        @Override
        public PrintWriter getWriter() throws UnsupportedEncodingException {
            return writer;
        }
     
        /** 重载父类获取flushBuffer的方法 */
        @Override
        public void flushBuffer() throws IOException {
            if (out != null) {
                out.flush();
            }
            if (writer != null) {
                writer.flush();
            }
        }
     
        @Override
        public void reset() {
            buffer.reset();
        }
     
        /** 将out、writer中的数据强制输出到WapperedResponse的buffer里面,否则取不到数据 */
        public byte[] getResponseData() throws IOException {
            flushBuffer();
            return buffer.toByteArray();
        }
     
        /** 内部类,对ServletOutputStream进行包装 */
        private class WapperedOutputStream extends ServletOutputStream {
            private ByteArrayOutputStream bos = null;
     
            public WapperedOutputStream(ByteArrayOutputStream stream)
                    throws IOException {
                bos = stream;
            }
     
            @Override
            public void write(int b) throws IOException {
                bos.write(b);
            }
     
            @Override
            public void write(byte[] b) throws IOException {
                bos.write(b, 0, b.length);
            }
     
            @Override
            public boolean isReady() {
                // TODO Auto-generated method stub
                return false;
            }
     
            @Override
            public void setWriteListener(WriteListener writeListener) {
                // TODO Auto-generated method stub
     
            }
        }
    }
    import java.io.BufferedReader;
    import java.io.ByteArrayInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.StringReader;
    import javax.servlet.ReadListener;
    import javax.servlet.ServletInputStream;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletRequestWrapper;
    public class WrapperedRequest extends HttpServletRequestWrapper {
     
        private String requestBody = null;
        HttpServletRequest req = null;
     
        public WrapperedRequest(HttpServletRequest request) {
            super(request);
            this.req = request;
        }
     
        public WrapperedRequest(HttpServletRequest request, String requestBody) {
            super(request);
            this.requestBody = requestBody;
            this.req = request;
        }
     
        /**
         * (non-Javadoc)
         *
         * @see javax.servlet.ServletRequestWrapper#getReader()
         */
        @Override
        public BufferedReader getReader() throws IOException {
            return new BufferedReader(new StringReader(requestBody));
        }
     
        /**
         * (non-Javadoc)
         *
         * @see javax.servlet.ServletRequestWrapper#getInputStream()
         */
        @Override
        public ServletInputStream getInputStream() throws IOException {
            return new ServletInputStream() {
                private InputStream in = new ByteArrayInputStream(
                        requestBody.getBytes(req.getCharacterEncoding()));
                @Override
                public int read() throws IOException {
                    return in.read();
                }
                @Override
                public boolean isFinished() {
                    // TODO Auto-generated method stub
                    return false;
                }
                @Override
                public boolean isReady() {
                    // TODO Auto-generated method stub
                    return false;
                }
                @Override
                public void setReadListener(ReadListener readListener) {
                    // TODO Auto-generated method stub
     
                }
            };
        }
    }

    记录技术,留下痕迹。如果有什么不合适的地方,请各位大佬留言指出,小弟改进!!!!

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

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

相关文章

Pycharm2023安装

PyCharm是一种Python IDE(集成开发环境),带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试、语法高亮、项目管理、代码跳转、智能提示、自动完成、单元测试、版本控制。此外,该IDE提供了一些高…

【SpringBoot篇】基于布隆过滤器,缓存空值,解决缓存穿透问题 (商铺查询时可用)

文章目录 🍔什么是缓存穿透🎄解决办法⭐缓存空值处理🎈优点🎈缺点🎍代码实现 ⭐布隆过滤器🎍代码实现 🍔什么是缓存穿透 缓存穿透是指在使用缓存机制时,大量的请求无法从缓存中获取…

Redis高级特性解析:持久化、主从复制与哨兵机制全面探讨

Redis持久化 RDB快照(snapshot) 在默认情况下, Redis 将内存数据库快照保存在名字为 dump.rdb 的二进制文件中。 你可以对 Redis 进行设置, 让它在“ N 秒内数据集至少有 M 个改动”这一条件被满足时, 自动保存…

bugkuctf web随记wp

常规思路: 1,源码2,抓包3,御剑dirsearch扫后台检查是否有git文件未删除4,参数 本地管理员:1,cu看源码,sci看源码有一串东西2,base64解码后是test123猜测是密码3&#x…

IDEA中显示方法、类注释信息

目录 一、IDEA测试版本及环境二、操作步骤2.1 鼠标悬停在某一个方法上,从而显示方法的注释信息2.2 调用方法时同步显示方法注释信息2.3 在new一个对象时,这个对象有很多重载的构造方法,想要重载的构造函数都显示出来 一、IDEA测试版本及环境 …

WPF仿网易云搭建笔记(6):Style进阶详解

文章目录 专栏和Gitee仓库前言Style简单使用样式字典全局样式局部全局样式全局样式穿透 专栏和Gitee仓库 WPF仿网易云 Gitee仓库 WPF仿网易云 CSDN博客专栏 前言 WPF想要批量设置样式属性,一共有3个方法 Style样式Template控件模板DataTemplate数据模板 WPF 零基础…

聚观早报 |iOS17.3引入设备被盗保护;iPhone16或调整设计

【聚观365】12月14日消息 iOS17.3引入设备被盗保护 iPhone16或调整设计 马斯克星链网络使用量飙升 华为鸿蒙智行App正式上线 特斯拉人形机器人Optimus二代上线 iOS17.3引入设备被盗保护 苹果向iPhone用户推送了iOS17.3开发者预览版Beta更新,本次更新距离上次发…

JVM虚拟机系统性学习-JVM调优之通过gceasy分析GC日志对堆、元空间、线程堆栈和垃圾回收器进行调优

通过 gceasy工具对生成的 GC 日志进行分析 这里使用的 JDK 版本为 JDK8! 在分析 GC 日志时,可以同时采用多种工具(Arthas、gceasy、JVM 连接 Graphana 监控)进行分析,避免某种工具分析不准确 gceasy 每个月只可以免费…

激光炸弹

title: 激光炸弹 date: 2023-12-14 19:42:59 tags: 前缀和 categories: 算法进阶指南 题目链接 − − > --> −−> 传送门 题目大意 思路 代码 #include<bits/stdc.h> #define fi first #define se second #define pb push_back #define sz size() #define …

mac python安装grpcio以及xcode升级权限问题记录

问题1: ERROR: Could not build wheels fol grpcio, which is required to install pyproject.toml-based projects pip3 install --no-cache-dir --force-reinstall -Iv grpcio1.41.0 # (我这里是降级安装的) 问题2: fatal error: ‘stdio.h’ file not found 25 | #include …

@德人合科技——天锐绿盾|电脑文件防止泄密|文件、文档、图纸、源代码等透明加密保护,防泄密软件系统

德人合科技——天锐绿盾提供了一种企业办公电脑文件防止泄密的解决方案&#xff0c;该方案对文件、文档、设计图纸、源代码等进行了透明加密保护。 pc访问地址&#xff1a; https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee 透明加密是一种保护文…

【Mars3d】关于locationBar等控件的css样式冲突处理问题

【Mars3d】关于locationBar等控件的css样式冲突处理问题 问题场景&#xff1a; 1.通过代码加载new mars3d.control.Zoom(或者通过地球map初始化配置 option.control {加载放大缩小工具控件的时候&#xff0c;出现图标的样式冲突效果&#xff1a; 2.sceneModePicker&#xf…

电脑开机出现:CLIENT MAD ADDR (网卡启动系统)的解决办法

文章目录 前言步骤1、确定情况2、对症下药——关闭网卡启动 补充1、关于BIOS2、关于PXE 前言 最近给旧电脑重装系统安了下开发环境和常用软件啥的&#xff0c;之前还好好启动的电脑&#xff0c;开机突然需要额外加载一个页面&#xff0c;虽然最后正常启动了不影响使用&#xf…

微信小程序uniapp记住密码

记住密码功能 在请求登录接口成功后&#xff0c;我们需要判断用户是否勾选记住密码&#xff0c;如果是&#xff0c;则将记住密码状态、账号信息存入本地。 下次登录时&#xff0c;获取本地的记住密码状态&#xff0c;如果为true则获取本地存储的账号信息&#xff0c;将信息回填…

构建外卖小程序:技术代码实践

在这个数字化的时代&#xff0c;外卖小程序已经成为餐饮业的一项重要工具。在本文中&#xff0c;我们将通过一些简单而实用的技术代码&#xff0c;向您展示如何构建一个基本的外卖小程序。我们将使用微信小程序平台作为例子&#xff0c;但这些原理同样适用于其他小程序平台。 …

供应链安全应该掌握哪些呢

整理了供应链安全相关的内容&#xff0c;涵盖了普及应用安全、信息安全意识的内容&#xff0c;这些内容可以面向企业全部员工进行讲解。后面包括了面向开发人员、测试人员、安全人员的内容&#xff0c;包括应用安全开发、供应链安全。面向架构人员的架构安全内容&#xff0c;后…

每日一题SQL

以下题目来源微信公众号【SQL数据库开发】 1、编写一个 SQL 查询来实现分数排名。如果两个分数相同&#xff0c;则两个分数排名&#xff08;Rank&#xff09;相同。请注意&#xff0c;平分后的下一个名次应该是下一个连续的整数值。换句话说&#xff0c;名次之间不应该有“间隔…

Django、Echarts异步请求、动态更新

前端页面 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>echarts示例</title> <script src"jquery.min.js"></script><script type "text/javascript" src "echarts.m…

持续集成交付CICD:Jenkins使用基于SaltStack的CD流水线下载Nexus制品

目录 一、理论 1.salt常用命令 二、实验 1.SaltStack环境检查 2.Jenkins使用基于SaltStack的CD流水线下载Nexus制品 二、问题 1.salt未找到命令 2.salt简单测试报错 3. wget输出日志过长 一、理论 1.salt常用命令 &#xff08;1&#xff09;salt 命令 该 命令执行s…

vue中 把vue页面导出为 html页面

vue导出文件后缀为html的页面 震惊&#xff01;我司要求我把数据融合起来&#xff0c;导出用html的方式展示&#xff0c;请看下面示例 <template><div><el-button click"gethtml">导出报告</el-button><div id"main"><…