在play框架中将javascript变量转换为scala
我在javascript中有一些变量:在play框架中将javascript变量转换为scala,javascript,scala,playframework,csrf,Javascript,Scala,Playframework,Csrf,我在javascript中有一些变量: var something = 1; var url = "@CSRF(routes.Some.thing(something))"; 我在编译过程中出错,因为“something”没有引用javascript变量,换句话说;编译器无法识别它。是否可以以某种方式转换/注入javascript变量?另外,这在javascript中是实时工作还是需要准备一个包含每个可能的“某物”值的“@CSRF(routes.Some.thing(something))”数
var something = 1;
var url = "@CSRF(routes.Some.thing(something))";
我在编译过程中出错,因为“something”没有引用javascript变量,换句话说;编译器无法识别它。是否可以以某种方式转换/注入javascript变量?另外,这在javascript中是实时工作还是需要准备一个包含每个可能的“某物”值的“@CSRF(routes.Some.thing(something))”数组
这应该是一个简单的rest调用,如routes文件所示:
/something/:something controllers.Some.thing(something : Long)
另一种选择是使用表单,但我不想这样做。您需要使用Javascript路由并将CSRF令牌添加到请求中 Javascript描述: 请看我对问题的回答,并解释如何将其用于资产(“正确且长期的解决方案”),其他活动的用法相同: 因此,在您的情况下,Javascript路由生成可以如下所示:
JavaScriptReverseRouter("jsRoutes")(
routes.javascript.Some.thing
)
在JavaScript中:
var something = 1;
var url = jsRoutes.controllers.Some.thing(something).url;
最后一个-不要忘记在请求中添加
Csrf Token
头。尽管play&twirl的整个过程看起来很神奇,但它仍然有一个“限制”,即模板内容是在服务器上填写的,而javascript变量something
存在于用户的浏览器中,页面在服务器上呈现并通过网络发送后很久。由于play
无法看到未来(也无法看到用户的浏览器),因此这似乎是不可能的。但是,您可以预先计算许多不同的路由,然后在JS中添加一些逻辑,以便在客户端选择正确的URL…@Andreytukin是的,这就是我的想法。。。这就是为什么我建议“准备一个“@CSRF(routes.Some.thing(something))”数组,其中包含每个可能的“something”值。这是好的做法吗?我有多个实体,每个实体都有几个选项。所以,有很多路线。我不确定这是否是一个好的做法。。。我可能会尝试将整个路由重新构造为一个带有参数的普通ajax请求,然后在服务器端决定重定向到哪里。你看过了吗?还有一些链接可能会有所帮助。我最终构建了csrf令牌,如下所示:“@play.filters.csrf.csrf.getToken.get.value”,我将其添加到url中,或者在ajax调用中添加头。