3

次のように、JSPX で JSON (Jackson 経由で生成) から Javascript 変数を初期化したいと考えています。

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

しかし、私が得る出力は次のようになります:

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

あなたがそこで何をしたか、文字列を HTML エスケープしたことがわかります。明らかに、データ内の山かっこがページを壊す可能性があるため、完全にエスケープしないままにすることはできません。しかし、すべての引用符をエスケープする必要はありません。なぜなら、JSON を属性値に入れているわけではないからです。

さて、これは HTML でスクリプトを記述するのに完全に有効な方法のように見えますが、必要以上に複雑です (たとえば、スペースを に置き換えるなど&#32;)。結局のところ、XHTML では問題なく動作しますが、HTML コンテンツ タイプでは、Firefox と IE の両方でエラーが発生します。根拠はよくわかりませんが、そういうことです。

それで、ここで最善のアプローチは何ですか?山かっこはエスケープしたいのですが、二重引用符はエスケープしたくないのですか、それとも他に落とし穴がありますか? 置き換えるタグはありc:outますか (Javascript をエスケープするための Spring タグがあることは知っていますが、それでも適切な種類のエスケープではありません)。人々はこれをどのように機能させるのですか?

ところで、はい、別の AJAX 呼び出しを行うこともできますが、この問題を回避するためだけに余分な往復を行うのはばかげているようです。

アップデート

CDATA と PCDATA について、そしてHTML と XHTML の違いについて、学ぶべきことがたくさんありました。ここで私は JSPX が多言語マークアップを簡単にするだろうと思っていましたが、誰かが言ったように、厄介な.

HTML の場合、<script>要素にはCDATA コンテンツ モデル(CDATA セクションと混同しないでください) があります。これは、何もエスケープできないことを意味しますが、絶対に避ける</ 必要があります。

JSON の特殊なケースでは、終了タグは引用符で囲まれた文字列内でのみ発生するため、安全なエスケープ方法は (HTML ではなく) Javascript エスケープを使用</して<\/.

一方、XHTML の場合 (そのようなことを気にする場合)、通常どおりすべてを XML エスケープするだけで ( becomeなど)、すべてが美しく機能します&。互換性のあるソリューションでは、本文全体に保護コメント (など)&amp;を付けて CDATA を使用し、JSON 内の出現箇所をエスケープする必要があります。さらに、安全のためだけに私も逃げます。確かに厄介な大きなボールですが、少なくとも自動化することはできます。<!--/*--><![CDATA[/*><!--*/<script>]]></

4

2 に答える 2

4

設定escapeXml=false

<c:out value="${myJson}" escapeXml="false"/>
于 2012-07-21T06:22:42.250 に答える
1

OK、ここで私自身の質問に答えます。多くの調査と実際の助けはありません。

上記の私の「更新」に基づいて、HTML をターゲットにする最も簡単な方法は次のとおりです。

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

醜いがシンプル。

残念ながら、これは有効な XML または XHTML を生成しません。本当にそれが必要な場合、有効な HTML は生成されませんc:outが、オリジナルは問題なく動作します。また、両方で機能する単一のソリューションが本当に必要な場合は、コンテンツ タイプから切り替えるか、次のすべてを実行するカスタム taglib (または TAGX) が必要になる可能性があります。

于 2012-07-24T03:06:41.343 に答える