【发布时间】:2014-08-29 07:04:11
【问题描述】:
在我的 Web 应用程序中,我试图在服务器上构建一个 JSON 字符串,然后将其传递给客户端,以便我可以使用一些客户端 javascript 来处理它。这在大多数情况下都有效,但是当 JSON 字符串包含单引号时,javascript 会中断。
JSON 基本上是一个地图列表,它通过mappings 变量传递到我的GSP 页面。然后我评估字符串以将其转换为 javascript 对象:
var json = eval('(${mappings})');
当 mappings 被计算时,完整的 javascript 表达式看起来像这样:
var json = eval('([{"targetId":123,"targetName":"this isn't going to work"}])');
很明显,在这种情况下,当mappings 包含一个单引号(“...this isn't going to work...”)时,JSON 字符串会提前终止,并且浏览器报告 javascript 错误。
我原以为这很容易解决,但是在 java 方面,当我尝试使用 \' 替换 ' 时
json.replaceAll("'", "\\'")
我明白了:
"...this isn't going to work..."
即它根本没有改变!
如果我尝试双重转义反斜杠,即
json.replaceAll("'", "\\\\'")
我明白了:
"...this isn\\'t going to work..."
这也不正确。如何用单个反斜杠和引号替换单引号,以便在客户端呈现字符串时可以正确评估它?
【问题讨论】:
-
为什么不使用
${mappings.encodeAsJavaScript()}编解码器的存在是有原因的。见:grails.org/doc/2.3.1/guide/security.html 但是做 eval() 无论如何都是浪费。 (见 Amadan 的回答)。
标签: java javascript regex grails escaping