在我的遗留项目中,我可以看到在将字符串发送到浏览器之前使用escapeHtml。
StringEscapeUtils.escapeHtml(stringBody);
我从api doc知道escapeHtml的作用。给出了一个例子: -
For example:
"bread" & "butter"
becomes:
"bread" & "butter".
我的理解是当我们在转义html之后发送字符串时,它转换了浏览器的责任 回到原始人物。是吗?
但是我没有得到原因,何时需要,如果我们发送字符串体而不转义html会发生什么?如果我们在将它发送到浏览器之前不做escapeHtml,费用是多少
答案 0 :(得分:10)
我可以想到几种可能性来解释为什么有时字符串不会被转义:
编辑 -
转义的原因是&
和<
等特殊字符最终会导致浏览器显示除您的意图之外的其他内容。裸&
在技术上是html中的错误。大多数浏览器尝试智能地处理此类错误,并在大多数情况下正确显示它们。 (例如,如果字符串是<div>
中的文本,这几乎肯定会在您的示例文本中发生。)但是,因为它是不好的标记,所以某些浏览器将无法正常工作;辅助技术(例如,文本到语音)可能会失败;并且可能还有其他问题。
尽管浏览器尽最大努力从糟糕的标记中恢复,但仍有几种情况会失败。如果您的示例字符串是属性值,则绝对需要转义引号。浏览器无法正确处理以下内容:
<img alt=""bread" & "butter"" ... >
一般规则是,任何不是标记但可能混淆为标记的字符都需要转义。
请注意,有几种上下文可以在html文档中显示文本,并且它们具有单独的转义要求。在属性值中,您需要转义引号和&符号(但不是<
)。您必须转义在文档的字符集中没有表示的字符(如果您使用的是UTF-8,则不太可能,但情况并非总是如此)。在文本节点中,只需要转义&
和<
。在href值中,必须转义需要在URL中转义的字符(有时会双重转义,因此在浏览器取消它们一次之后它们仍会被转义)。在CDATA块中,通常不应转义任何内容(在HTML级别)。
最后,除了双重转义的危险之外,转义所有文本的成本是最小的:网络上的一小部分额外处理和一些额外字节。
答案 1 :(得分:3)
HTML(现在我们更好地说XML)定义了许多所谓的“特殊”字符,这意味着这些字符对于浏览器具有特殊含义,而“普通”字符仅仅意味着自己。例如,字符串"Hello, World!"
仅包含“普通”字符,因此对于浏览器来说,字面意思是"Hello, World!"
。字符串"<b>Hello, World!</b>"
包含特殊字符'<'
,'>'
和'/'
,对于浏览器,它表示:typeset string "Hello, World!" in bold
而不仅仅是typeset "<b>Hello, World!</b>"
。
方法escapeHtml (String)
可能(我无法确定,因为我不知道它是如何实现的)将任意字符串转换为HTML代码,这将指示浏览器按字面排版此字符串。例如,escapeHtml ("<b>Hello, World!</b>")
将返回HTML代码,该代码将被浏览器解释为typeset "<b>Hello, World!</b>" normally
而不是typeset string "Hello, World!" in bold
。如果正确实现了方法escapeHtml (String)
,那么您不应该关心此方法生成的HTML代码是什么样的。只需在要求浏览器按字面排版字符串的地方使用它。
答案 2 :(得分:2)
当有可能与页面生成的html(读取jsp)一起解释时,你必须转义html或xml。
这个好question也解释了它。
答案 3 :(得分:1)
根据我的经验,所有字符串都应该在显示在页面上之前从Html中转义。我们当前的项目是关于从Active Directory管理所有组织单元,这些单元可以包含任何特殊字符(包括Html字符)。在页面上显示时,您最终可以使用以下代码显示名为User <Marketing>
<a href="viewDetail.do"> <%=request.getAttribute("Name");%> </a>
在页面呈现后,它将变为
<a href="viewDetail.do"> User <Marketing> </a>
页面上实际显示为User
超链接。
但是,如果您在发送到页面之前转义Html值
request.setAttribute("Name", StringEscapeUtils.escapeHtml("User <Marketing>"));
在页面呈现后,它将变为
<a href="viewDetail.do"> User <Marketing> </a>
在JSP页面上正确显示
很快,您使用转义的Html字符来阻止特殊输入。如果输入包含Html字符,则在呈现期间页面将显示错误