【发布时间】:2012-07-21 06:21:19
【问题描述】:
我想从我的 JSPX 中的一些 JSON(通过 Jackson 生成)初始化一个 Javascript 变量,如下所示:
<script>
var x = <c:out value="${myJson}" />;
</script>
但我得到的输出看起来像:
<script>
var x = {"foo":"bar"};
</script>
我看到你在那里做了什么,对字符串进行 HTML 转义。显然,我不能让它完全不转义,因为数据中的尖括号可能会破坏页面。但我真的不需要转义所有引号,因为我没有将 JSON 放在属性值中,对吗?
现在,这似乎是一种用 HTML 编写脚本的完全有效的方法,只是不必要地复杂(例如,用 结果证明,它在 XHTML 中工作得很好,但是对于 HTML 内容类型,我在 Firefox 和 IE 中都得到一个错误。我不确定其中的原因,但事实就是如此。 &#32; 替换空格)。
那么,这里最好的方法是什么?我真的想简单地转义尖括号而不是转义双引号,还是有其他问题?是否有可以替换c:out 的标签(我知道有用于转义Javascript 的Spring 标签,但这仍然不是正确的转义方式)?人们如何让它发挥作用?
顺便说一句,是的,我可以进行单独的 AJAX 调用,但是为了解决这个问题而进行额外的往返似乎很愚蠢。
更新
关于 CDATA 与 PCDATA 以及 HTML is different from XHTML 的区别,我有很多要了解的。在这里,我认为 JSPX 会让polyglot markup 变得简单,但事实证明,正如有人所说,a big ball of nasty。
对于 HTML,<script> 元素有一个 CDATA content model(不要与 CDATA 部分混淆),这意味着没有任何东西可以转义,但 </ 必须绝对避免。
在 JSON 的特殊情况下,结束标记只能出现在带引号的字符串中,因此这意味着安全的转义方法是使用 Javascript(而不是 HTML)转义并将</ 替换为<\/。
另一方面,对于 XHTML(如果您关心这些事情),您只需像往常一样对所有内容进行 XML 转义(&amp; 变为 &amp; 等),并且一切正常。兼容的解决方案必须在整个 <script> 主体周围使用带有保护 cmets(<!--/*--><![CDATA[/*><!--*/ 等)的 CDATA,然后在 JSON 中转义任何出现的 ]]>;此外,为了安全起见,我仍然会逃离</。确实很讨厌,但至少可以自动化。
【问题讨论】:
标签: javascript json jsp jsp-tags jspx