2013-02-08 63 views
6

在我的遗留项目中,我可以在将字符串发送到浏览器之前看到escapeHtml的用法。当我需要转义Html字符串?

StringEscapeUtils.escapeHtml(stringBody); 

我从API文档知道什么escapeHtml does.here是给出的例子: -

For example: 
"bread" & "butter" 
becomes: 
"bread" & "butter". 

我的理解是,当我们逃避的HTML浏览器的责任,其将 回后发送字符串原始人物。是对的吗?

但我没有得到为什么,当它是必需的,如果我们发送字符串正文而不转义html会发生什么?如果我们在发送给浏览器之前不做escapeHtml,那么它的代价是什么

回答

9

我能想到的几种可能解释为什么有时一个字符串没有逃脱:

  • 也许原来的程序员有信心,在某些地方的字符串没有特殊字符(但是,在我看来这会是不好的编程习惯;逃避​​一个字符串作为对未来变化的保护成本非常低)
  • 该字符串已经在代码中的该点处被转义。你绝对不想逃避一个字符串两次;用户将最终看到转义序列而不是预期的文本。
  • 该字符串是实际的html本身。你不想逃避html;你想浏览器来处理它!

编辑 - 原因逃逸是,像&<特殊字符可以最终导致浏览器中显示比您预期其他什么东西。在技​​术上,一个空的&在html中是错误的。大多数浏览器都会尝试智能处理这些错误,并在大多数情况下正确显示它们。 (例如,如果字符串是<div>中的文本,那么在您的示例文本中几乎肯定会发生这种情况。)但是,由于标记不正确,某些浏览器无法正常工作;辅助技术(例如,文本到语音)可能会失败;并可能有其他问题。

尽管浏览器从糟糕的标记中恢复过程,但仍有几种情况会失败。如果您的示例字符串是属性值,则转义引号将是绝对必需的。有没有办法,浏览器是要正确处理是这样的:

<img alt=""bread" & "butter"" ... > 

一般的规则是,不标记,但可能会被混淆为标记的任何字符需要进行转义。

请注意,有几种上下文可以在html文档中显示文本,并且它们具有单独的转义要求。在属性值内,您需要转义引号和和号(但不是<)。您必须转义在文档的字符集中没有表示的字符(如果您使用的是UTF-8,则不太可能),但并非总是如此。在文本节点中,只有&<需要转义。在href值中,需要在url中转义的字符必须被转义(并且有时会双倍转义,以便在浏览器忽略它们一次后逃脱)。在CDATA块内,通常不应该有任何内容(在HTML级别)。

最后,除了双重转义的危险之外,转义所有文本的代价是最小的:网络上额外的一点点处理和一些额外的字节。

+0

Ted再次,我的问题是如何逃离HTML帮助将它发送到浏览器?如果我们不这样做成本是多少? –

+0

@MSach - 我扩大了我的答案。 –

+0

谢谢泰德详细的解释。还有一个问题是,当我们发送字符&浏览器时,浏览器在渲染之前是否自动将该字符(在这种情况下&lt;)自动转换为? –

2

如果有可能它会被页面生成的html(read jsp)解释,你必须转义html或xml。

这个不错question也解释它。

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代码如何看起来像。只要在想让浏览器按照字面排版字符串的地方使用它即可。

1

从我的经验来看,所有的字符串都应该从Html中转义出来,然后再显示在页面上。我们目前的项目是关于管理Active Directory中的所有组织单位,并且这些单位可以包含任何特殊字符(包括Html字符)。当页面上显示,你可能最终用下面的代码显示一个记录称为User <Marketing>

<a href="viewDetail.do"> <%=request.getAttribute("Name");%> </a> 

呈现页面后,它将成为

<a href="viewDetail.do"> User <Marketing> </a> 

里面居然出现User超链接上这一页。

然而,如果你的页面被渲染后发送到页面

request.setAttribute("Name", StringEscapeUtils.escapeHtml("User <Marketing>")); 

之前逃脱HTML值,它将成为

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

其正确显示在JSP页面

不久,您将使用转义的Html字符来防止特殊输入。如果输入包含Html字符,您的页面在渲染过程中将出现错误