在Play

时间:2015-08-07 09:10:32

标签: javascript ajax scala cookies playframework

我有一个可用语言的下拉列表。目前,单击某种语言会映射到控制器中的方法,该方法使用所选语言更新播放会话(引擎盖下的cookie)并返回索引页。

查看:

<a href="@routes.Application.setLanguage("en")">English</a>

控制器:

def setLanguage(language: String): Action[AnyContent] = Action { implicit request =>
  val updatedSession = request.session + (("lang", language))
  Redirect(routes.Application.index()).withSession(updatedSession)
}

正如您所看到的,我重定向到索引页面,它工作正常。但是,由于语言选择在我的页面上始终可用,因此可以从/ resource1,/ resource2,/ resource3等单击它。我想刷新该特定视图而不是返回到主页。我不能简单地在控制器中获取request.uri并刷新它指向的内容,因为setLanguage()被映射到它自己的路由,所以我的请求URI总是/ language?lang = whatever。

那么,我怎么知道在调用GET on / language之前,客户端是在/例如/ items,所以我可以重新加载项目页面而不是让他回到主页?我应该发送一个带有资源作为参数的GET请求(例如?lang = en&amp; location = items)来知道要呈现哪个页面?我应该发出ajax请求并成功调用window.location.reload()吗?我甚至需要去服务器,还是只需从客户端手动更新PLAY_SESSION cookie?

我正在使用Play 2.3.7。

2 个答案:

答案 0 :(得分:1)

否则您无法从客户端更新PLAY_SESSION cookie,因为它是通过播放应用程序密钥进行签名的。

因此,我认为最简单的解决方案是将当前资源作为参数发送并触发重定向。

答案 1 :(得分:1)

有一个名为Referer的HTTP标头,其中包含发出请求的网址。据我所知,当您从一个页面导航到另一个页面时,所有现代浏览器都支持和使用它。 您只需重定向到该Referer网址即可。

另一个解决方案是在会话或cookie中跟踪用户访问的所有页面,方法是使用Global.scala中的某种拦截器或您在任何地方使用的自定义Action构建器。然后,如果语言发生变化,您只需重定向到用户访问的最后一页。