StringEscapeUtils:给你的字符串穿上“防弹衣“——转义工具类深度解析
各位代码勇士们好!今天我们要聊的是Apache Commons Lang3中的StringEscapeUtils工具类。如果说StringUtils是瑞士军刀,那StringEscapeUtils就是你的字符串保镖,专门负责在各种危险场合保护你的字符串安全!
一、为什么需要字符串转义?
想象你家的猫在键盘上踩出了一段JSON:
{"name": "Tom&Jerry","bio": "I <3 fish & chips"
}
直接发给前端?恭喜你收获一个报错大礼包!这时候就需要StringEscapeUtils来给你的字符串穿上"防弹衣"了。
二、StringEscapeUtils的武器库
1. HTML防弹衣系列
String html = "<script>alert('嘿嘿嘿')</script>";
System.out.println(StringEscapeUtils.escapeHtml4(html));
// 输出:<script>alert('嘿嘿嘿')</script>String safeHtml = "<div>安全内容</div>";
System.out.println(StringEscapeUtils.unescapeHtml4(safeHtml));
// 输出:<div>安全内容</div>
2. XML护甲套装
String xml = "<message>小心 & 符号</message>";
System.out.println(StringEscapeUtils.escapeXml11(xml));
// 输出:<message>小心 & 符号</message>
3. JSON防暴盾牌
(注意:Lang3版本移除了JSON相关方法,推荐用其他库如commons-text)
// 假装我们在用commons-text
String jsonValue = "Line1\nLine2\tTab\"Quote";
System.out.println(StringEscapeUtils.escapeJson(jsonValue));
// 输出:Line1\nLine2\tTab\"Quote
4. CSV金钟罩
String csvCell = "你好,世界"; // 包含逗号的单元格
System.out.println(StringEscapeUtils.escapeCsv(csvCell));
// 输出:"你好,世界" (自动加引号)
5. SQL铁布衫
String userInput = "John'; DROP TABLE users;--";
System.out.println(StringEscapeUtils.escapeSql(userInput));
// 输出:John''; DROP TABLE users;--
// 注意:这只能防简单注入,真正的安全请用PreparedStatement
三、特殊场景生存指南
1. 处理URL参数
String urlParam = "搜索?q=java&python";
System.out.println(StringEscapeUtils.escapeHtml4(urlParam));
// 输出:搜索?q=java&python
2. 多平台换行符统一
String text = "Line1\r\nLine2\rLine3";
System.out.println(StringEscapeUtils.escapeJava(text));
// 输出:Line1\nLine2\nLine3
3. 反转义妙用:解析HTML内容
String escaped = "<strong>加粗</strong>";
System.out.println(StringEscapeUtils.unescapeHtml4(escaped));
// 输出:<strong>加粗</strong>
四、版本变迁冷知识
- Lang3 3.6之前:StringEscapeUtils包含JSON相关方法
- Lang3 3.6之后:JSON方法搬家到commons-text
- 重要变化:新版本推荐使用具体的XXXEscaper类(如HtmlEscaper)
五、最佳实践(避坑指南)
- 不要过度转义:转义两次会得到"双重防弹衣",比如
&lt;
- 注意上下文:HTML属性需要额外转义单引号/双引号
- 性能考虑:大量处理时考虑使用StringBuilder
- 安全提醒:转义≠安全!防XSS还需要配合其他措施
六、现代替代方案
// Java 8+ 的Text Blocks(原生支持换行符)
String html = """<html><body>Hello & World</body></html>""";// 第三方库如OWASP ESAPI(企业级安全)
ESAPI.encoder().encodeForHTML(input);
七、总结
StringEscapeUtils就像是:
- 给HTML穿的防弹衣💂
- 给XML戴的防毒面具😷
- 给JSON配的安全头盔🪖
- 给CSV准备的防溅罩🥽
记住老司机的忠告:“不转义的字符串就像裸奔的代码,迟早要出事!”
最后送大家一张安全转义对照表:
特殊字符 | HTML转义 | XML转义 |
---|---|---|
< | < | < |
> | > | > |
& | & | & |
" | " | " |
’ | ' | ' |
(注:本文示例基于commons-text 1.9,使用时请根据实际版本调整)