私はいくつかのレガシーコードのエラーを持って、それを修正しようとしているときに私は理解していないという行動を発見しました。アプリケーションは、JSPとJSTLを使用して春のMVCアプリケーションです。以下は、私が話してい動作を再現簡略化した例です。私のコントローラのコードは次のとおりです。
@GetMapping("/users/thing")
public ModelAndView thing() {
ModelAndView model = new ModelAndView("users/thing");
String stringWithApostrophe = "Any'String";
String escapedWithHtmlUtils = HtmlUtils.htmlEscape(stringWithApostrophe);
model.addObject("stringWithApostrophe", stringWithApostrophe);
model.addObject("escapedWithHtmlUtils", escapedWithHtmlUtils);
return model;
}
変数は、stringWithApostrophe
その中にアポストロフィ文字があり、その後、私はそれを脱出し、他の変数にエスケープ値を格納します。その後、私はモデルにそれらの両方を追加します。
私のビューは、このようなものです:
<p><a onClick="clicked('${stringWithApostrophe}');" href="#">stringWithApostrophe: ${stringWithApostrophe}</a></p>
<p><a onClick="clicked('${escapedWithHtmlUtils}');" href="#">escapedWithHtmlUtils: ${escapedWithHtmlUtils}</a></p>
<script type="text/javascript">
function clicked(text){
console.log(text);
}
</script>
Iを押すとCTRL+U
、私のブラウザでは、私は以下を参照してください。ページのソースを表示するには:
<p><a onClick="clicked('Any'String');" href="#">stringWithApostrophe: Any'String</a></p>
<p><a onClick="clicked('Any'String');" href="#">escapedWithHtmlUtils: Any'String</a></p>
...良いを見て、次のようにレンダリングしています:
...私も期待したものです。私はそれがまた期待通りに失敗した最初のリンクをクリックすると、ブラウザのコンソールショーエラーメッセージSyntax error: missing ) after argument list
エスケープアポストロフィはjavascriptのコードを破ったため。
私は仕事への2番目のリンクを期待ものの、それはまた、同じエラーメッセージが表示され、失敗します。なぜこのような場合でしょうか?私はそれを理解できない、アポストロフィは、次のようなHTMLエンティティに変換されてCTRL+U
表示されるので、それはJavaScriptを破ってはなりません。私は、このために考えられる原因については、インターネットで探していますが、何も見つからなかったしてきました。私は何をしないのですか?
アップデート:私は、アップロードしたプロジェクト例の場合には、それは便利です、私はGitHubのにエラーを再現するために使用します。
あなたの質問で述べたように、アポストロフィが正常になるためにHtmlUtilsクラスによってHTML実体参照に変換されます'
。コンテンツはJavaScriptエンジンに渡される前に説明した動作は、属性値のHTMLパーサ解決実体参照ので、発生しています。内のエンティティonclick(...)
のステートメントは、したがって、元の文字にデコードされた'
の下に示されているよう。
onClick="clicked('Any'String');"
=> onClick="clicked('Any'String');"
。
したがって、JSエンジンに、2基onClick(...)
の文は等価です。
参照してくださいこの関連の議論の問題の詳細については、議論を。