Java 当我需要转义Html字符串时?

Java 当我需要转义Html字符串时?,java,escaping,stringescapeutils,Java,Escaping,Stringescapeutils,在我的遗留项目中,我可以在字符串发送到浏览器之前看到escapeHtml的用法 StringEscapeUtils.escapeHtml(stringBody); 我从api文档中知道escapeHtml的功能。下面是给出的示例:- For example: "bread" & "butter" becomes: "bread" & "butter". 我的理解是,当我们在转义html后发送字

在我的遗留项目中,我可以在字符串发送到浏览器之前看到escapeHtml的用法

StringEscapeUtils.escapeHtml(stringBody);
我从api文档中知道escapeHtml的功能。下面是给出的示例:-

For example: 
"bread" & "butter"
becomes: 
"bread" & "butter".
我的理解是,当我们在转义html后发送字符串时,它是浏览器转换的责任 回到原来的角色。是这样吗


但是我不明白为什么以及何时需要它,如果我们发送字符串正文而不转义html会发生什么?如果我们在将其发送到浏览器之前不执行escapeHtml,成本是多少?如果可能会与页面生成的html(阅读jsp)一起被解释,则必须转义html或xml


这也解释了这一点。

我可以想出几种可能的方法来解释为什么有时字符串没有转义:

  • 也许最初的程序员确信在某些地方字符串没有特殊字符(但是,在我看来,这是一种糟糕的编程实践;为了防止将来的更改,逃逸字符串的成本很低)
  • 该字符串已在代码中的该点转义。您肯定不想两次逃逸字符串;用户最终将看到转义序列,而不是预期的文本
  • 字符串是实际的html本身。你不想逃避html;你想让浏览器来处理它
编辑- 转义的原因是,像
&
HTML(现在我们最好说XML)这样的特殊字符定义了许多所谓的“特殊”字符,这意味着这些字符对浏览器有特殊的意义,而“普通”字符只是指它们自己。例如,字符串
“Hello,World!”
只包含“普通”字符,因此它在浏览器中的字面意思是
“Hello,World!”
。字符串
“Hello,World!”
,包含特殊字符
'
'/'
,对于浏览器来说,它的意思是:
将字符串“Hello,World!”以粗体显示,而不仅仅是
排版“Hello,World!”


方法
escapeHtml(String)
可能(我不能确定,因为我不知道它是如何实现的)将任意字符串转换为HTML代码,该代码将指示浏览器按字面意思对该字符串进行排版。例如,
escapeHtml(“Hello,World!”)
返回HTML代码,浏览器将其解释为
排版“Hello,World!”,通常是
而不是
排版字符串“Hello,World!”(粗体)
。如果方法
escapeHtml(String)
实现正确,您就不应该关心此方法生成的HTML代码是什么样子的。只要在您想让浏览器按字面排版某些字符串的地方使用它。

根据我的经验,所有字符串在显示在页面上之前都应该从Html中转义。我们当前的项目是管理Active Directory中的所有组织单元,这些单元可以包含任何特殊字符(包括Html字符)。在页面上显示时,您可以使用以下代码显示名为
User

呈现页面后,它将成为

 <a href="viewDetail.do"> User &lt;Marketing&gt; </a>

正确显示在JSP页面上的


简而言之,您可以使用转义Html字符来阻止特殊输入。如果输入包含Html字符,您的页面在呈现过程中将再次出现错误

Ted我的问题是,在将Html发送到浏览器之前,转义Html有何帮助?如果我们不这样做,成本是多少?@MSach-我扩展了我的答案。感谢Ted的详细解释。还有一个问题是,当我们将字符<发送到浏览器时,浏览器是否将该字符转换(在本例中<转换为@MSach-这正是它所做的。(至少如果它是
,分号是关键的。)关键点是当

<a href="viewDetail.do"> <%=request.getAttribute("Name");%> </a>
<a href="viewDetail.do"> User <Marketing> </a>
request.setAttribute("Name", StringEscapeUtils.escapeHtml("User <Marketing>"));
 <a href="viewDetail.do"> User &lt;Marketing&gt; </a>