【问题标题】:Escaping JSON in JSPX在 JSPX 中转义 JSON
【发布时间】:2012-07-21 06:21:19
【问题描述】:

我想从我的 JSPX 中的一些 JSON(通过 Jackson 生成)初始化一个 Javascript 变量,如下所示:

<script>
var x = <c:out value="${myJson}" />;
</script>

但我得到的输出看起来像:

<script>
var x = {&#034;foo&#034;:&#034bar&#034};
</script>

我看到你在那里做了什么,对字符串进行 HTML 转义。显然,我不能让它完全不转义,因为数据中的尖括号可能会破坏页面。但我真的不需要转义所有引号,因为我没有将 JSON 放在属性值中,对吗?

现在,这似乎是一种用 HTML 编写脚本的完全有效的方法,只是不必要地复杂(例如,用&amp;#32; 替换空格)。 结果证明,它在 XHTML 中工作得很好,但是对于 HTML 内容类型,我在 Firefox 和 IE 中都得到一个错误。我不确定其中的原因,但事实就是如此。

那么,这里最好的方法是什么?我真的想简单地转义尖括号而不是转义双引号,还是有其他问题?是否有可以替换c:out 的标签(我知道有用于转义Javascript 的Spring 标签,但这仍然不是正确的转义方式)?人们如何让它发挥作用?

顺便说一句,是的,我可以进行单独的 AJAX 调用,但是为了解决这个问题而进行额外的往返似乎很愚蠢。

更新

关于 CDATA 与 PCDATA 以及 HTML is different from XHTML 的区别,我有很多要了解的。在这里,我认为 JSPX 会让polyglot markup 变得简单,但事实证明,正如有人所说,a big ball of nasty

对于 HTML,&lt;script&gt; 元素有一个 CDATA content model(不要与 CDATA 部分混淆),这意味着没有任何东西可以转义,但 &lt;/ 必须绝对避免。

在 JSON 的特殊情况下,结束标记只能出现在带引号的字符串中,因此这意味着安全的转义方法是使用 Javascript(而不是 HTML)转义并将&lt;/ 替换为&lt;\/

另一方面,对于 XHTML(如果您关心这些事情),您只需像往常一样对所有内容进行 XML 转义(&amp;amp; 变为 &amp;amp; 等),并且一切正常。兼容的解决方案必须在整个 &lt;script&gt; 主体周围使用带有保护 cmets(&lt;!--/*--&gt;&lt;![CDATA[/*&gt;&lt;!--*/ 等)的 CDATA,然后在 JSON 中转义任何出现的 ]]&gt;;此外,为了安全起见,我仍然会逃离&lt;/。确实很讨厌,但至少可以自动化。

【问题讨论】:

    标签: javascript json jsp jsp-tags jspx


    【解决方案1】:

    设置escapeXml=false

    <c:out value="${myJson}" escapeXml="false"/>
    

    【讨论】:

      【解决方案2】:

      好的,经过大量研究并且没有真正的帮助,在这里回答我自己的问题。

      根据我上面的“更新”,定位 HTML 的最直接方法就是:

      <script>
      var x = ${fn:replace(myJson, "\</", "\<\\/")};
      </script>
      

      丑陋但简单。

      不幸的是,这不会产生有效的 XML 或 XHTML。如果您真的需要,原始的 c:out 可以正常工作,尽管它不会 生成有效的 HTML。如果你真的需要一个解决方案来处理这两个问题,你可能需要一个自定义 taglib(或 TAGX),它可以从内容类型切换或执行以下所有操作:

      • 将脚本主体包装在comment-guarded CDATA 部分中
      • 将每个&lt;/ 替换为&lt;\/
      • 将每个]]&gt; 替换为]]\&gt;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多