2013-02-08 93 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字符,您的頁面在渲染過程中將出現錯誤