在Play框架中,如何将JavaScript变量转换为Scala?

3

我有一些javascript变量:

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

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

这应该是一个简单的rest调用,在路由文件中看到:

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

另一个选择是使用表单,但我想尽量不用。


尽管play和twirl看起来像魔法一样,但它仍然有“限制”,即模板内容在服务器上填充,而您的javascript变量something存在于用户的浏览器中,在页面在服务器上呈现并通过网络发送后长时间存在。由于play无法看到未来(也无法看到用户的浏览器),因此似乎不可能这样做。但是,您可以预先计算许多不同的路线,然后在JS中添加一些逻辑以在客户端选择正确的URL... - Andrey Tyukin
@AndreyTyukin 是的,这就是我想的...所以我建议"准备一个包含每个可能的“something”值的"@CSRF(routes.Some.thing(something))"数组"。这是好的做法吗?我有多个实体,每个实体都有一些选项。所以,这是很多路由。 - Marcus Persson
我不确定这是否是一个好的做法... 我可能会尝试将整个路由事情重新构建为带参数的普通ajax请求,然后在服务器端决定重定向的位置。你看过这里这里吗?还有一些其他链接可能会有所帮助。 - Andrey Tyukin
1个回答

0

你需要使用Javascript Routing并将CSRF令牌添加到请求中。

Javascript Routing描述:https://www.playframework.com/documentation/2.6.x/ScalaJavascriptRouting

查看我的答案,解释如何将其用于assets("正确且长的解决方案"),其他活动的用法相同:如何在play框架项目中从javascript更新img的src?

因此,在您的情况下,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调用中的头部。 - Marcus Persson

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