[英]Escaping apostrophes in HTML with Spring
我在一些遗留代码中有错误,在尝试修复它时,我发现了一个我不理解的行为。 该应用程序是一个使用JSP和JSTL的Spring 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>
如果我在浏览器中按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
显示错误消息Syntax error: missing ) after argument list
因为未转义的撇号打破了javascript代码。
但是,尽管我希望第二个链接起作用, 但它也会失败,并显示相同的错误消息 。 为什么会这样? 我无法理解,撇号被转换为CTRL+U
显示的html实体,因此它不应该破坏javascript。 我一直在互联网上寻找可能的原因,但一无所获。 我错过了什么?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.