【问题标题】:Refreshing a page with cookies in Play在 Play 中使用 cookie 刷新页面
【发布时间】:2015-08-07 17:19:30
【问题描述】:

我有一个可用语言的下拉选项。目前,点击一种语言会映射到控制器中的一个方法,该方法会使用所选语言更新 Play Session(这是一个 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。

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

我使用的是 Play 2.3.7。

【问题讨论】:

    标签: javascript ajax scala cookies playframework


    【解决方案1】:

    不,您不能从客户端更新 PLAY_SESSION cookie,因为它是由 play 使用应用程序密钥签名的。

    所以我认为最简单的解决方案是按照建议将当前资源作为参数发送并触发重定向。

    【讨论】:

    • 谢谢。我将 location 参数添加到我的控制器方法中,并从视图中传递 request.uri。进入控制器后,我只需使用更新的 cookie 重定向到 Call("GET", location)。
    【解决方案2】:

    有一个名为Referer 的HTTP 标头包含发出请求的URL。据我所知,当您从一个页面导航到另一个页面时,所有现代浏览器都支持和使用它。 您可以简单地重定向到该Referer url。

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

    【讨论】:

    • 感谢您的信息。我研究了Referer,它似乎并不是一个可靠的解决方案。使用拦截器或自定义 Action 构建器似乎是一种开销。我最终只是将 request.uri 传递给控制器​​方法,然后它知道要重定向到什么。
    猜你喜欢
    • 2013-07-16
    • 1970-01-01
    • 2013-12-24
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    相关资源
    最近更新 更多