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

后端生成的URL中含base64参数值,经tomcat重定向后偶发前端无法解密报错

现象

最近定位到一个有意思的bug,后端生成的URL中包含base64参数值后,经过tomcat重定向后,偶发出现前端无法解密的现象。

原因

当出现问题时,经排查发现重定向的Location响应头中把+转成了英文空格,导致解密失败。

重定向时如果特殊字符未经URLEncode转义,则tomcat会把+转换成英文空格。

处理方案

方案1、对Base64参数值进行UrlEncode。推荐

此方案会将所有特殊符号替换成%数字字母格式,如%2B,最后一个字母大小写不敏感。

Java代码:

/* by yours.tools - online tools website : yours.tools/zh/textdiff.html */ String plainText = "hello>"; String encodedText = Base64.getEncoder().encodeToString(plainText.getBytes(StandardCharsets.UTF_8)); String urlEncodedText = URLEncoder.encode(url, StandardCharsets.UTF_8.toString()); response.sendRedirect("http://127.0.0.1:8080/test?encode=" + urlEncodedText); //http://127.0.0.1:8080/test?encode=aGVsbG8%2B

JavaScript代码:

/* by yours.tools - online tools website : yours.tools/zh/textdiff.html */ const encode = 'aGVsbG8%2B' const decode = atob(decodeURIComponent(encode)) console.log(decode) //hello>

方案2、Base64使用UrlEncoder进行加密。需前端配合

基于2006年的RFC规范:RFC4648 URL安全字符串替换(+替换成-/替换成_

前端的JS方法atob()btoa()首个版本即支持;ECMAScript 2024+的Uint8Array.fromBase64()也是支持的。

Java代码:

String plainText = "hello>"; String encodedText = Base64.getUrlEncoder().encodeToString(plainText.getBytes(StandardCharsets.UTF_8)); response.sendRedirect("http://127.0.0.1:8080/test?encode=" + encodedText); //http://127.0.0.1:8080/test?encode=aGVsbG8-

JavaScript代码:

//写法1:替换回-为+,_为/,补全=,使用atob()完成base64解密 const encodeText = 'aGVsbG8-' let encode = encodeText.replace(/-/g, '+') .replace(/_/g, '/') .padEnd(encodeText.length + (4 - encodeText.length % 4) % 4, '='); const result = atob(decodeURIComponent(encode)) console.log(result) //写法2:替换后使用TextDecoder解密 <script src="https://unpkg.com/base64-js/base64js.min.js"></script> <script> function decodeBase64Url(base64UrlString) { // 转换为标准Base64 const base64 = base64UrlString .replace(/-/g, '+') .replace(/_/g, '/') .padEnd(base64UrlString.length + (4 - base64UrlString.length % 4) % 4, '='); // 解码 const byteArray = base64js.toByteArray(base64); return new TextDecoder().decode(byteArray); } console.log(decodeBase64Url('aGVsbG8-')) </script>

方案3、调整tomcat配置

不推荐,可自行搜索。

http://www.cnnetsun.cn/news/180544.html

相关文章:

  • 破解APP同质化:在“复制风暴”中寻找破局之道
  • 为什么越来越多企业转向Open-AutoGLM?与LoadRunner的4大差异全披露
  • Open-AutoGLM报销提交提速80%:自动化流程你真的用对了吗?
  • 35、Windows 服务器性能监控与优化指南
  • 【AI自动化运维新突破】:Open-AutoGLM断点续跑技术实现99.9%任务可达性
  • Open-AutoGLM考勤自动化实战指南(从环境搭建到每日自动签到)
  • 【Open-AutoGLM大模型轻量化协同】:揭秘高效AI推理背后的黑科技与落地实践
  • Open-AutoGLM报销单据提交实战解析(90%人都忽略的关键细节)
  • 【Open-AutoGLM高手进阶指南】:5步构建高精度理财收益预测系统
  • 前端新人必看:HTML5表格也能做圆角?实战技巧全解析
  • 59、Windows 7 登录与安全设置全攻略
  • 计算机毕业设计springboot垂钓服务信息管理系统 基于SpringBoot的休闲垂钓综合服务平台 SpringBoot+MySQL垂钓社区与资源预约系统
  • Open-AutoGLM能帮你多赚20%?深度解析其复利计算引擎的三大黑科技
  • 从理论到落地:Open-AutoGLM量子协同的7个关键突破点
  • 为什么90%的Open-AutoGLM生物认证项目初期都失败了?真相在这里
  • Open-AutoGLM实战指南:9步实现量子-大模型联合训练,效率提升300%
  • 弹窗关闭失效怎么办?Open-AutoGLM高频故障应对策略大公开
  • springboot基于Java 足浴洗浴管理系统设计和实现_1fx39f1p
  • 还在手动算收益?Open-AutoGLM自动化计算让你效率提升10倍,秒出结果
  • 轴承(二维圆柱和二维球模型)和三维深沟球有限元模型画好网格,可直接拿去ansys仿真计算,适合...
  • 基于VUE的好利来蛋糕销售网站[VUE]-计算机毕业设计源码+LW文档
  • 拒绝无效加班!免费 RPA 工具合集,轻松搞定数据录入 / 报表整理
  • 【Open-AutoGLM量子协同突破】:揭秘量子计算与大模型融合的5大核心技术
  • 基于YOLOv11的苹果成熟度识别检测系统(YOLOv11深度学习+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)
  • 5个策略帮助企业充分利用YashanDB数据库
  • 5个策略提升你对YashanDB数据库的掌控力
  • 5个策略助力提升YashanDB数据库的可用性
  • 背调公司怎么选?一份基于核心维度的评估清单
  • 【独家披露】Open-AutoGLM内部训练数据曝光:它是如何学会“人性化”推荐的?
  • 还在手动查账单?Open-AutoGLM让你一键获取所有消费明细!