5

我知道我可以在Ok(...).withCookies(...)返回动作时设置 cookie。但是我想知道是否有办法通过操作request对象来设置一些 cookie。这样我就可以在我的模型中设置一些 cookie,而我的控制器只需要将它们发回。

4

1 回答 1

6

我这样做只是作为练习,也是为了表明 Play 框架非常灵活,它不会在任何意义上限制你。我完全从 Play 源代码中弄清楚了如何做到这一点,它非常干净且易于阅读。这不是HttpRequest使用 cookie 或实际上使用Play 中的对象的首选方式。正如Jatin建议的那样,您应该将您的 cookie 解码为适当的模型,将这些模型传递给您的服务,然后将您的服务结果转换为 play.api.mvc.Result,从而使您的 http 和业务逻辑层分开。

这是代码(您可以看到该Headers对象不打算以这种方式使用):

import play.api.http.HeaderNames.COOKIE

val cookies = Cookies(request.headers.get(COOKIE)).cookies

val myCookies = cookies + ("cookieName" -> Cookie("cookieName", "cookieValue"))

val headersMap = request.headers.toMap

val myHeaderMap = headersMap +  
      (COOKIE -> Seq(Cookies.encode(myCookies.values.toSeq)))

val myHeaders = new play.api.mvc.Headers {
  val data:Seq[(String, Seq[String])] = myHeaderMap.toSeq
}

val modifiedRequest = request.copy(headers = myHeaders)
于 2013-08-07T08:36:30.850 回答