如何使用Thymeleaf的th:utext正确显示带换行的邮箱地址?
解决方案:Thymeleaf渲染带换行和邮箱的文本问题
问题根因
你当前的字符串处理顺序错误:先将换行替换为<br>标签,再转义所有<和>,导致需要渲染为换行的<br>被转成了<br>纯文本,自然无法触发换行;而邮箱的尖括号虽然被正确转义,但换行功能失效。
方法一:调整Java端文本处理顺序
先转义用户输入中的XML特殊字符(避免XSS风险,同时正确显示邮箱尖括号),再替换换行和制表符为HTML格式标签/实体。这样我们手动添加的<br>和 不会被转义,能被Thymeleaf正确解析。
Java代码示例
// 引入Apache Commons Text工具类(推荐,覆盖所有XML特殊字符转义) import org.apache.commons.text.StringEscapeUtils; // 处理流程:先转义原始文本,再替换格式符号 String escapedComment = StringEscapeUtils.escapeXml11(comment); String formattedComment = escapedComment .replaceAll("(\r\n|\r|\n|\n\r)", "<br>") .replaceAll("\t", " "); commentData.setCommentText(formattedComment);
如果不想引入第三方依赖,也可以手动转义核心特殊字符,但工具类更可靠:
String escapedComment = comment .replaceAll("&", "&") .replaceAll("<", "<") .replaceAll(">", ">") .replaceAll("\"", """) .replaceAll("'", "'"); // 后续替换换行和制表符步骤同上
Thymeleaf模板代码
保持使用th:utext渲染处理后的文本:
<span th:utext="${comment.commentText}"></span>
方法二:直接在Thymeleaf模板中处理
将原始文本保留在POJO中,通过Thymeleaf内置工具类完成转义和格式替换,减少Java端逻辑:
Thymeleaf代码示例
<span th:utext="${#strings.replaceRegex(#strings.replaceRegex(#strings.escapeXml(comment.commentText), '(\r\n|\r|\n)', '<br>'), '\t', ' ')}"></span>
拆分逻辑说明:
#strings.escapeXml():转义用户输入中的XML特殊字符,确保邮箱尖括号显示正常#strings.replaceRegex():将所有换行符替换为<br>标签- 再次使用
replaceRegex():将制表符替换为多个空格实体
效果验证
处理后,邮箱<test@g.com>会被转义为<test@g.com>,通过th:utext渲染后显示为<test@g.com>;换行符被替换为<br>标签,会被解析为换行,同时避免了XSS注入风险。
内容的提问来源于stack exchange,提问作者Veera
相关产品推荐
相关产品推荐

