当前位置: 首页 > news >正文

保姆级教程:给若依(RuoYi)前后端分离项目加上Base64接口加密(附完整代码)

若依(RuoYi)项目Base64接口加密全流程实战指南

在前后端分离架构中,接口数据传输安全始终是开发者需要关注的重点。对于采用若依(RuoYi)框架的项目,当面临"需要简单加密但又不希望引入复杂方案"的需求时,Base64编码作为一种轻量级解决方案,能够在不显著增加系统复杂度的前提下,实现基础的数据混淆功能。本文将手把手带你完成从零到一的完整实现过程。

1. 环境准备与基础认知

在开始编码前,我们需要明确几个关键点:

  • Base64的本质:它并非加密算法,而是一种编码方式,主要作用是将二进制数据转换为可打印字符。虽然不能替代真正的加密,但对于防止数据明文传输已经足够。
  • 适用场景评估:适合对安全性要求不高,但需要避免数据直接暴露的场景,如内部系统、临时演示环境等。
  • 技术方案选型:前后端分离架构下,我们需要同时处理:
    • 前端:请求发出前的数据编码
    • 后端:请求接收时的解码 → 业务处理 → 响应编码
    • 前端:响应接收后的解码

环境检查清单

# 前端依赖检查 npm list js-base64 # 后端工具类验证 ls src/main/java/com/ruoyi/common/utils/sign/Base64.java

2. 前端改造:请求/响应拦截器调整

2.1 安装并引入Base64库

首先在前端项目中添加必要的依赖:

npm install --save js-base64

然后在src/utils/request.js顶部添加引用:

import { Base64 } from 'js-base64'

2.2 改造请求拦截器

找到request.interceptors.request部分,修改配置处理逻辑:

config.data = Base64.encode(JSON.stringify(config.data)) config.headers['Content-Type'] = 'text/plain' // 修改Content-Type return config

注意:这里需要将数据先JSON序列化再编码,避免直接编码对象导致的异常

2.3 改造响应拦截器

response.interceptors.response部分添加解码逻辑:

try { const res = JSON.parse(Base64.decode(response.data)) return res } catch (e) { console.error('响应解码失败:', e) return Promise.reject('数据解析异常') }

常见问题排查表

现象可能原因解决方案
请求被拒绝Content-Type未修改确保设置为text/plain
解码后数据异常未进行JSON序列化检查encode前的处理流程
中文乱码字符集不匹配统一使用UTF-8编码

3. 后端实现:过滤器与包装类

3.1 创建请求/响应包装类

com.ruoyi.framework.web.filter包下新建两个包装类:

Request包装类

public class EncryptRequestWrapper extends HttpServletRequestWrapper { private final String requestBody; public EncryptRequestWrapper(HttpServletRequest request, String body) { super(request); this.requestBody = body; } @Override public ServletInputStream getInputStream() { ByteArrayInputStream stream = new ByteArrayInputStream( requestBody.getBytes(StandardCharsets.UTF_8)); return new ServletInputStream() { // 实现必要方法 }; } }

Response包装类

public class EncryptResponseWrapper extends HttpServletResponseWrapper { private ByteArrayOutputStream buffer; public EncryptResponseWrapper(HttpServletResponse response) { super(response); this.buffer = new ByteArrayOutputStream(); } @Override public ServletOutputStream getOutputStream() { return new ServletOutputStream() { // 实现写入buffer的逻辑 }; } public byte[] getResponseData() { return buffer.toByteArray(); } }

3.2 实现核心过滤器

创建ApiEncryptFilter类:

public class ApiEncryptFilter implements Filter { @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; // 1. 获取并解码请求体 String requestBody = getRequestBody(request); String decodedBody = new String( Base64.decode(requestBody), StandardCharsets.UTF_8); // 2. 使用包装类继续处理 EncryptRequestWrapper requestWrapper = new EncryptRequestWrapper(request, decodedBody); EncryptResponseWrapper responseWrapper = new EncryptResponseWrapper(response); chain.doFilter(requestWrapper, responseWrapper); // 3. 编码响应数据 byte[] responseData = responseWrapper.getResponseData(); String encodedResponse = Base64.encode(responseData); response.getOutputStream().write(encodedResponse.getBytes()); } private String getRequestBody(HttpServletRequest request) { // 读取请求体的实现 } }

3.3 注册过滤器

在配置类中添加:

@Bean public FilterRegistrationBean<ApiEncryptFilter> encryptFilter() { FilterRegistrationBean<ApiEncryptFilter> registration = new FilterRegistrationBean<>(); registration.setFilter(new ApiEncryptFilter()); registration.addUrlPatterns("/*"); registration.setOrder(Ordered.LOWEST_PRECEDENCE - 1); return registration; }

4. 进阶优化与安全增强

4.1 性能优化策略

对于高频接口,可以考虑以下优化手段:

  • 缓存Base64编解码器实例

    private static final Base64.Decoder DECODER = Base64.getDecoder(); private static final Base64.Encoder ENCODER = Base64.getEncoder();
  • 批量处理大文件

    // 分块处理大文件 byte[] buffer = new byte[8192]; while((len = input.read(buffer)) != -1) { output.write(ENCODER.encode(buffer, 0, len)); }

4.2 增强安全性

虽然Base64不是加密方案,但我们可以增加一些简单防护:

  1. 添加固定前缀

    // 前端 const encoded = 'RU_' + Base64.encode(data) // 后端 if(!requestBody.startsWith("RU_")) { throw new IllegalRequestException(); }
  2. 结合简单时间戳验证

    // 请求时添加时间戳 config.data.timestamp = Date.now()

安全等级对比表

方案实现复杂度安全性适用场景
纯Base64极低内部测试
Base64+前缀中低基础防护
HTTPS+Base64生产环境

5. 测试验证与问题排查

5.1 单元测试用例

前端测试脚本

describe('Base64编解码测试', () => { it('应该正确编码简单对象', () => { const testData = { name: '测试' } const encoded = Base64.encode(JSON.stringify(testData)) expect(encoded).to.match(/[A-Za-z0-9+/]+={0,2}/) }) })

后端测试类

@Test public void testFilter() throws Exception { MockHttpServletRequest request = new MockHttpServletRequest(); request.setContent("RU_eyJ0ZXN0IjoidmFsdWUifQ==".getBytes()); ApiEncryptFilter filter = new ApiEncryptFilter(); filter.doFilter(request, new MockHttpServletResponse(), (req, res) -> { // 验证解码结果 assertEquals("{\"test\":\"value\"}", req.getInputStream().toString()); }); }

5.2 常见问题解决方案

  1. 数据截断问题

    • 现象:长数据解码不完整
    • 解决:检查包装类中的缓冲区实现
  2. 中文乱码

    • 确保所有环节统一使用UTF-8
    new String(decodedBytes, StandardCharsets.UTF_8)
  3. 性能瓶颈

    • 使用JVM参数调优:
    -XX:+UseG1GC -Xms512m -Xmx1024m

在实际项目中,这种方案已经成功应用于多个内部管理系统,特别是在需要快速满足基础安全审计要求的场景下。一个典型的案例是某政务系统的问卷模块,在三天内就完成了从明文传输到Base64编码的改造,顺利通过了初步的安全检查。

http://www.jsqmd.com/news/533535/

相关文章:

  • 讲讲汤阴新兴工程塑化实力怎么样,产品价格贵不贵 - myqiye
  • 算法/力扣--链表经典题目
  • 开箱即用:Ollama平台Phi-3-mini镜像,一键开启AI对话功能
  • 2026上海高端腕表鉴定费用全解析:36大品牌收费标准+六城正规门店指南 - 时光修表匠
  • 计算机毕业设计:美食推荐系统设计与协同过滤算法应用 Django框架 可视化 协同过滤推荐算法 菜谱 食品 机器学习(建议收藏)✅
  • 2026年北京口碑好的工部优选十大品牌推荐,专业评选规则全解析 - 工业品牌热点
  • 图像矢量化:从位图到矢量图的智能转换技术全解析
  • FreeCAD参数化设计实战:3步打造你的智能机械零件库
  • 3个让你彻底告别手动操作的英雄联盟智能助手方案
  • 细聊2026年工业用不锈钢管制造厂,选购时如何选到好用的厂家 - mypinpai
  • 【深度解析】立式注塑机多少钱一台?核心技术与应用:从原理到价值落地 - 速递信息
  • 基于JMeter与STOMP协议,构建高并发WebSocket消息推送压测方案
  • 天猫购物卡如何变现?秒懂回收技巧! - 团团收购物卡回收
  • 全球逾51.1万台停止更新的微软IIS服务器暴露在互联网上
  • 社招上岸字节:一个Vue工程师如何用AI思维搞定三轮技术面(附完整复盘录音技巧)
  • 分析2026年PP中空板加工厂的费用情况,哪个性价比高 - 工业设备
  • LFM2.5-1.2B-Thinking-GGUF部署教程:7860端口健康检查与500错误排查
  • 上海高端腕表鉴定费用全解析:从百达翡丽到欧米茄,京沪深杭宁锡六地鉴定标准与成本深度报告 - 时光修表匠
  • Ideogram-V3 Edit API 调用完全手册
  • DREAMER数据集实战:基于EEG和ECG的多模态情绪识别技术解析
  • 诊疗效率提升20%:星林医疗家具中医诊室改造案例 - 速递信息
  • Poetry:高效Python项目管理实战指南
  • 量子债务转移:把技术屎山抛给平行宇宙——软件测试从业者的生存与反击指南
  • 性价比高的猫粮有哪几种品牌?猫粮排行榜2026最新 - 资讯焦点
  • 看看2026年PP中空板供应商排名,交货快且靠谱的品牌有哪些 - 工业品网
  • 实战演练:基于快马平台构建具备Markdown实时预览的增强型nodepad应用
  • Ostrakon-VL-8B行业落地:社区团购自提点监控——包裹识别、取件合规与滞留预警
  • 银渐层猫吃什么猫粮好?2026英短银渐层最适合的十大猫粮品牌推荐 - 资讯焦点
  • 3分钟极速部署WrenAI:让业务人员也能轻松对话数据库的智能分析神器
  • openclaw 学习资源 与三种沙箱模式的区别及配置