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