我知道在返回动作时我可以在Ok(...).withCookies(...)
中设置Cookie。但是我想知道是否有办法通过操纵request
对象来设置一些cookie。所以我可以在我的模型中设置一些cookie,我的控制器只需要将它们发回去。
答案 0 :(得分:6)
我这样做只是为了锻炼,而且还表明Play框架非常灵活,并且在任何意义上都不会限制你。我想出了如何纯粹从Play源代码中做到这一点,它非常干净且易于阅读。 NOT 是使用Cookie或在Play中使用HttpRequest
对象的首选方式。正如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)