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

Java后端处理前端字符串与 JSON 数据:安全拼接与转义技巧

在现代 Web 开发中,前后端数据交互是家常便饭。我们经常需要处理前端传递的字符串和 JSON 数据,并在后端进行加工处理后发送到其他服务。本文将以 Spring Boot 为例,探讨如何安全地拼接字符串和 JSON 数据,并介绍如何避免 JSON 特殊字符导致的潜在问题。

场景重现:前端数据,后端加工

假设我们正在开发一个电商平台,前端需要将用户评论(字符串)和商品信息(JSON 数组)发送到后端。后端需要将用户评论进行简单处理(例如添加时间戳),然后将其与商品信息合并成新的 JSON 数据,并发送到推荐服务进行分析。

前端代码(示例):

const comment = "这款产品真不错!";
const productInfo = [{"id": 1, "name": "商品A"},{"id": 2, "name": "商品B"}
];// ... 使用 Fetch API 发送 POST 请求到后端 ...

后端代码(Spring Boot):

import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
// ... 其他 imports@RestController
public class DataController {@PostMapping("/api/processData")public String processData(@RequestBody RequestData data) {String comment = data.getComment();List<Map<String, Object>> productInfo = data.getProductInfo();// 对评论进行处理String processedComment = "【" + LocalDateTime.now() + "】 " + comment;// 将处理后的评论添加到 JSON 数组Map<String, Object> newEntry = new HashMap<>();newEntry.put("comment", processedComment);productInfo.add(newEntry);// ... 使用 RestTemplate 发送 POST 请求到推荐服务 ...}
}// ... RequestData 类定义 ...

潜藏危机:JSON 特殊字符

上述代码看似简单,但却隐藏着一个潜在的风险:如果用户评论中包含 JSON 特殊字符(例如双引号、反斜杠等),就会导致生成的 JSON 数据格式错误,从而引发解析异常。

例如,如果用户评论为 "这款产品 "真不错!", 生成的 JSON 数据就会变成:

[{"id": 1, "name": "商品A"},{"id": 2, "name": "商品B"},{"comment": "【2023-10-26T16:05:30.220】 "这款产品 "真不错!""}
]

可以看到,由于评论中的双引号未经转义,导致生成的 JSON 格式错误,无法被正确解析。

解决方案:手动转义特殊字符

为了解决这个问题,我们需要对用户评论中的特殊字符进行转义。最简单的方法是手动替换:

// ...
String processedComment = "【" + LocalDateTime.now() + "】 " + escapeJson(comment);
// ...// 手动转义 JSON 特殊字符
private String escapeJson(String str) {if (str == null) {return null;}return str.replace("\\", "\\\\").replace("\"", "\\\"").replace("\b", "\\b").replace("\f", "\\f").replace("\n", "\\n").replace("\r", "\\r").replace("\t", "\\t");
}

更优解:借助 Jackson 库

手动转义虽然可行,但代码显得冗长。我们可以借助 Spring Boot 默认集成的 Jackson 库来更优雅地解决问题:

// ...
ObjectMapper objectMapper = new ObjectMapper();
newEntry.put("comment", objectMapper.writeValueAsString(processedComment)); 
// ...

objectMapper.writeValueAsString() 方法会将 Java 对象序列化为 JSON 字符串,并自动处理特殊字符转义。

另外一种使用 Apache Commons Text 库中的 StringEscapeUtils 类:

import org.apache.commons.text.StringEscapeUtils;
// ...
String escapedString = StringEscapeUtils.escapeJson(modifiedString);
Map<String, Object> newEntry = new HashMap<>();
newEntry.put(\"string\", escapedString);
jsonData.add(newEntry);
// ...
  • 优点:专门用于字符串转义,效率较高。
  • 缺点:需要添加额外的依赖。

总结

在 Spring Boot 中处理前端传递的字符串和 JSON 数据时,需要注意潜在的 JSON 特殊字符问题。我们可以通过手动转义或借助 Jackson 库来安全地拼接字符串和 JSON 数据,确保数据完整性和程序稳定性。

希望本文能够帮助您更好地理解 Spring Boot 中字符串与 JSON 数据处理的相关技巧,并在实际项目中得心应手。

相关文章:

Java后端处理前端字符串与 JSON 数据:安全拼接与转义技巧

在现代 Web 开发中&#xff0c;前后端数据交互是家常便饭。我们经常需要处理前端传递的字符串和 JSON 数据&#xff0c;并在后端进行加工处理后发送到其他服务。本文将以 Spring Boot 为例&#xff0c;探讨如何安全地拼接字符串和 JSON 数据&#xff0c;并介绍如何避免 JSON 特…...

一文搞懂bfs,dfs和高级图算法

你以为BFS&#xff08;广度优先搜索&#xff09;和DFS&#xff08;深度优先搜索&#xff09;这两种基础算法&#xff0c;简单到小学数学就能搞定&#xff1f;但真的是这样吗&#xff1f;很多人都这么认为&#xff0c;但真的对吗&#xff1f;今天&#xff0c;我们不只是走马观花…...

【Rust光年纪】Rust异步编程利器:异步DNS、高性能Web服务器一网打尽

构建高效网络应用必备&#xff1a;解读Rust异步编程神器 前言 Rust 是一种快速流行的系统编程语言&#xff0c;它以其内存安全和并发性能而闻名。在 Rust 生态系统中&#xff0c;有许多优秀的库和框架可以帮助开发者构建高性能、可靠的应用程序。本文将介绍几个在 Rust 中备受…...

04学生管理系统(栈)

文章目录 预处理菜单结构体主函数函数声明栈操作功能实现 预处理 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<windows.h> #include<conio.h>#define OVERFLOW -2 #define FALSE 0 #define TRUE 1 #define OK 1 …...

我们如何在centos上部署批量管理工具ansible

1&#xff09;我们先准备环境、设备 #我们准备一台服务机 &#xff08;192.168.61.140&#xff09; ​#然后准备几天客户机&#xff08;192.168.61.141 192.168.61.142&#xff09;这里我们准备两台2)然后我们在客服务机里面添加域名 vi /etc/hosts ​ #添加如下内容 192.…...

如何评估前端代码审查培训计划的有效性?

评估前端代码审查培训计划的有效性可以通过以下方法&#xff1a; 培训前后测试&#xff1a; 在培训前后对学员进行测试&#xff0c;比较结果以评估知识增长。 学员反馈&#xff1a; 通过问卷调查、访谈或开放式反馈收集学员对培训内容、方式和效果的看法。 参与度&#xff1a…...

使用nvm切换Node.js版本

一、安装nvm nvm&#xff08;Node Version Manager&#xff09;是一个用于管理Node.js版本的工具&#xff0c;它允许你在同一台机器上安装和切换多个Node.js版本。 1.安装nvm https://github.com/coreybutler/nvm-windows 访问以上链接到github去下载 点击releases 下载下图…...

x264 编码器 PSNR算法源码分析

PSNR PSNR(Peak Signal-to-Noise Ratio,峰值信噪比)是一种常用的图像质量评价指标,用于衡量图像或视频的清晰度和质量。PSNR是基于信号的最大可能功率与影响信号的噪声功率之间的比率。在图像处理领域,PSNR通常用来评估图像压缩或图像增强算法的效果。 PSNR的计算公式是…...

开源web版3D展示工具Online3DViewer

Online3DViewer是一个免费且开源的Web解决方案&#xff0c;它允许用户在浏览器中直接预览和探索3D模型。 以下是关于Online3DViewer的详细介绍&#xff1a; 一、基本概述 定义&#xff1a;Online3DViewer是一个在线3D模型查看器&#xff0c;支持多种3D文件格式&#xff0c;用…...

白骑士的Matlab教学实战项目篇 4.2 信号与图像处理项目

系列目录 上一篇&#xff1a;白骑士的Matlab教学实战项目篇 4.1 数据分析与可视化 信号处理和图像处理是 MATLAB 的重要应用领域&#xff0c;广泛应用于医学、工程、科学研究等领域。以下内容将介绍信号滤波与频域分析、图像增强与分割的基本概念和方法&#xff0c;并通过一个…...

复现、并改进open-mmlab的mmpose详细细节

复现open-mmlab的mmpose详细细节 1.配置环境2.数据处理3.训练4.改进mmpose4.1 快速调试技巧4.2 快速定位4.3 改进backbone4.3.1 使用说明4.3.2 改进案例4.3.2.1 复现mmpose原配置文件4.3.2.2 复现开源项目4.3.2.3 修改配置文件4.3.2.4 修改新模型 4.4 添加auxiliary_head4.4.1 …...

编写兼容Python2.x与3.x代码

编写兼容Python2.x与3.x代码 当我们正处于Python2.x到Python3.x的过渡期时&#xff0c;你可能想过是否可以在不修改任何代码的前提下能同时运行在Python2和3中。这看起来还真是一个合理的诉求&#xff0c;但如何开始呢&#xff1f;哪些Python2代码在3.x解释器执行时容易出状况…...

比特币8.12学习问题

疑问&#xff1a;什么是过滤&#xff0c;什么是offset 没有投钱的情况下&#xff0c;怎么用api 公式&#xff1a;单币分配金额 总资金 / 2/ offset/选币数量&#xff0c;其中2 表示多空 买入滑点&#xff08;Slippage&#xff09;是指在执行交易订单时&#xff0c;实际成交…...

解析 Vue 中的app.version、 app.provide 与 app.runWithContext :原理、应用与实例剖析

目录 app.provide app.runWithContext ​​​​​​​app.version 非 VIP 用户能够通过积分下载博文资源 app.provide 在 Vue 3.0 中,app.provide充当着在应用层级提供全局共享数据或者服务的关键角色。 app.provide(key, value) 这一方法接收两个关键参数,其中 …...

Ubuntu server 命令行跑selenium

背景 自动化测试都是在本机win上使用selenium 跑自动化脚本,但是服务器都是命令行的没有web界面 依赖包部署 apt-get install zlib1g-dev zlib1g## 安装谷歌浏览器 ## 跳到底部,选择其他平台 https://www.google.com/chrome/## ubuntu # dpkg -i google-chrome-stable_…...

刚刚,模糊测试平台SFuzz受到行业认可

近日&#xff0c;中国网络安全产业联盟&#xff08;CCIA&#xff09;正式发布了“2024年网络安全优秀创新成果大赛-安全严选专题赛”评选结果&#xff0c;开源网安模糊测试平台SFuzz凭借重大创新能力&#xff0c;得到组委会认可&#xff0c;获本次大赛创新产品优胜奖。 2024年网…...

数据结构与算法——DFS(深度优先搜索)

算法介绍&#xff1a; 深度优先搜索&#xff08;Depth-First Search&#xff0c;简称DFS&#xff09;是一种用于遍历或搜索树或图的算法。这种算法会尽可能深地搜索图的分支&#xff0c;直到找到目标节点或达到叶节点&#xff08;没有子节点的节点&#xff09;&#xff0c;然后…...

基于lambda简化设计模式

写在文章开头 本文将演示基于函数式编程的理念&#xff0c;优化设计模式中繁琐的模板化编码开发&#xff0c;以保证用尽可能少的代码做尽可能多的事&#xff0c;希望对你有帮助。 Hi&#xff0c;我是 sharkChili &#xff0c;是个不断在硬核技术上作死的 java coder &#xff…...

揭秘! 经纬恒润“车路云一体化”方案研发服务背后的科技驱动力

随着高级别智能驾驶技术的飞速发展&#xff0c;自动驾驶与路侧基础设施协同合作已成为行业内的又一热点。我国率先提出以“车路云一体化”为核心的战略布局&#xff0c;国家政策密集出台&#xff0c;地方试点积极推进&#xff0c;行业标准日趋完善&#xff0c;智能网联汽车“车…...

Redis操作--RedisTemplate(二)StringRedisTemplate

一、介绍 1、简介 由于存储在 Redis 中的 key 和 value 通常是很常见的 String 类型&#xff0c;Redis模块提供了 RedisConnection 和 RedisTemplate 的扩展&#xff0c;分是 StringRedisConnection 和 StringRedisTemplate&#xff0c;作为字符串操作的解决方案。 通过源码…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...