【问题标题】:Convert a javascript variable to scala in play framework在播放框架中将javascript变量转换为scala
【发布时间】:2018-07-16 17:24:39
【问题描述】:

我在 javascript 中有一些变量:

var something = 1;
var url = "@CSRF(routes.Some.thing(something))";

我在编译过程中遇到错误,因为 "something" 没有引用 javascript 变量,换句话说;编译器无法识别它。是否可以以某种方式转换/注入 javascript 变量?另外,这是否可以在 javascript 中实时工作,还是我需要准备一个 "@CSRF(routes.Some.thing(something))" 数组,其中包含每个可能的“某物”值?

这应该是一个简单的休息调用,见于路由文件:

/something/:something controllers.Some.thing(something : Long)

另一种方法是使用表格,但我想尽量不要。

【问题讨论】:

  • 尽管 play & twirl 的整个过程看起来很神奇,但它仍然存在模板内容在服务器上填写的“限制”,而您的 javascript 变量 something 存在于用户的浏览器,在页面在服务器上呈现并通过网络发送很久之后。由于play 看不到未来(也看不到用户的浏览器),因此这似乎不可能。但是,您可以预先计算许多不同的路由,然后在 JS 中添加一些逻辑以在客户端选择正确的 URL...
  • @AndreyTyukin 是的,这就是我的想法......这就是为什么我建议“准备一个包含每个可能的“某物”值的“@CSRF(routes.Some.thing(something))”数组” .这是好习惯吗?我有多个实体,每个实体都有几个选项。所以,路线很多。
  • 我不确定这是否是一个好习惯......我可能会尝试将整个路由重新构建为带有参数的普通 ajax 请求,然后决定重定向到哪里在服务器端。你看过herehere吗?有一些进一步的链接可能会有所帮助。

标签: javascript scala playframework csrf


【解决方案1】:

您需要使用 Javascript 路由并将 CSRF 令牌添加到请求中。

Javascript 路由说明:https://www.playframework.com/documentation/2.6.x/ScalaJavascriptRouting

看我对问题的回答,并解释如何将其用于资产(“正确且长期的解决方案”),其他活动的用法相同:How to update src of a img from javascript in a play framework project?

因此,在您的情况下,Javascript 路由生成可能如下所示:

JavaScriptReverseRouter("jsRoutes")(
  routes.javascript.Some.thing
)

在 JavaScript 中:

var something = 1;
var url = jsRoutes.controllers.Some.thing(something).url;

最后一个 - 不要忘记在请求中添加 Csrf-Token 标头。

【讨论】:

  • 我最终构建了这样的 csrf-token:“@play.filters.csrf.CSRF.getToken.get.value”,我将其添加到 url,或者是 ajax 调用中的标头.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-10
  • 1970-01-01
  • 2016-06-13
  • 1970-01-01
相关资源
最近更新 更多