在Play Framework中,引号应该放在哪个位置才合适?

3
我有以下流程:
  1. 用户被展示一个表单。
  2. 他填写表单字段,并提交到控制器,控制器将此持久化到数据库
  3. 在另一个页面上,控制器从数据库中获取该记录,并将其传递给视图
  4. 视图将其作为Javascript变量捕获: var foo =' $ {user.bar}';
  5. 现在,如果用户在表格中输入这个字符串:

    I have a quote - ' - very dangerous
    

    然后这个引用被传递到数据库和返回,导致一个损坏的 javascript 语句:

    var foo = 'I have a quote - ' - very dangerous';
    

    什么是避免此字符的最佳方法,该如何实现?我不想为每个模板使用手动处理,这样既繁琐又容易出错。

我刚刚发现了Java扩展模块。这真的是我们能做到的最好吗 - 使用${user.bar.addSlashes().raw()}?它相当冗长且容易出错。http://www.playframework.org/documentation/1.2.4/javaextensions - ripper234
1
如果您正在使用Rythm模板引擎,可以这样写:var foo = '@user.bar.escapeJavaScript()';。请访问http://www.playframework.org/modules/rythm了解更多关于Rythm模板引擎的信息。 - Gelin Luo
1个回答

4
数据就是数据。如果其中包含引号,那么它就包含引号,并且必须以此方式存储在数据库中。在使用此字符串作为JavaScript字符串文字时,您需要转义引号。
您可以使用Apache commons-lang的StringEscapeUtils.escapeECMAScript()方法来完成这项工作,或者您可以将Java对象编码为JSON字符串,并在JavaScript代码中解析JSON字符串。

这种方法不是既啰嗦又容易出错吗?现在这是我们最好的选择吗? - ripper234
顺便提一下,关于Java扩展模块,请参见我上面的评论。 - ripper234
你到底希望得到什么?一款神奇的工具会知道你正在生成JS字面字符串,并为你自动转义吗?当你生成HTML时,必须对字符串进行HTML转义。当你生成JS字符串时,必须对字符串进行JS转义。 - JB Nizet
当我生成HTML时,Play会为我处理转义,对吧?也许我希望有另一个Play操作符来减少冗长... $$user.foo$$。我猜现在可能还不存在这个操作符,甚至没有第三方模块。我暂时接受你的答案。 - ripper234
我对Play了解不够,不知道是否存在某些神奇的符号或标记。我的观点是,在视图层必须进行转义。而且我怀疑Play是否会为你转义任何内容。 - JB Nizet
1
它默认执行HTML转义:https://dev59.com/8W025IYBdhLWcg3w1ZoL - ripper234

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接