不同之处
如果必须跨多个HTTP请求保留数据,则可以将它们保存在Session或Flash Scope中。存储在Session数据是整个用户Session期间可用,而存储在Flash Scope内的数据只能用于下一个请求
这是很重要的:了解Session和Flash数据不是由服务器存储,而可以被添加在后续的HTTP请求中,是使用cookie机制完成的。这意味着数据大小非常有限(最多4 KB),并且您只能存储字符串值。cookie的默认名称是PLAY_SESSION。这可以通过application.conf中修改play.http.session.cookieName在来更改。
如果更改了cookie的名称,则可以使用设置和丢弃cookie中提到的相同方法丢弃较早的cookie 。
当然,cookie值是使用密钥签名的,因此客户端无法修改cookie数据(或者它将会失效)。
播放Session不打算用作缓存。如果需要缓存某些与特定Session相关的数据,可以使用Play内置缓存机制并在用户Session中存储唯一ID,以使它们与特定用户相关。
Session配置
有关如何配置Sessioncookie参数的更多信息,请参阅配置SessionCookieapplication.conf。
Session超时/到期
默认情况下,Session没有自动超时。它在用户关闭Web浏览器时到期。如果您需要使特定应用程序的Session超时,可以通过配置play.http.session.maxAge来application.conf设置Sessioncookie的最长时间,并且这也将设置play.http.session.jwt.expiresAfter为相同的值。该maxAge属性将从浏览器中删除cookie,并且将在cookie中设置JWT exp声明,并在给定的持续时间后使其无效。有关更多信息,请参阅配置SessionCookie。
在Session中存储数据
由于Session只是一个Cookie,它也只是一个HTTP头。您可以像操作其他结果属性一样操纵Session数据:
Ok("Welcome!").withSession( "connected" -> "user@gmail.com")
请注意,这将取代整个Session。如果需要向现有Session添加元素,只需向传入Session添加元素,并将其指定为新Session:
Ok("Hello World!").withSession( request.session + ("saidHello" -> "yes"))
您可以通过相同的方式从传入Session中删除任何值:
Ok("Theme reset!").withSession( request.session - "theme")
读取Session值
您可以从HTTP请求中检索传入的Session:
def index = Action { request =>
request.session.get("connected").map {
user => Ok("Hello " + user) }.getOrElse {
Unauthorized("Oops, you are not connected")
}
}
丢弃整个Session
有特殊操作丢弃整个Session:
Ok("Bye").withNewSession
Flash scope
Flash Scope与Session完全相同,但有两个不同之处:
· 数据仅保留一个请求
· Flash cookie未签名,使用户可以对其进行修改。
要点: Flash Scope仅应用于在简单的非Ajax应用程序上传输成功/错误消息。由于数据仅保留用于下一个请求,并且由于无法保证在复杂的Web应用程序中确保请求顺序,因此Flash Scope受竞争条件的限制。
以下是使用Flash Scope的一些示例:
def index = Action { implicit request =>
Ok {
request.flash.get("success").getOrElse("Welcome!")
}
}
def save = Action {
Redirect("/home").flashing(
"success" -> "The item has been created")
}
要在视图中检索Flash Scope值,请添加隐式Flash参数:@()(implicit flash: Flash)
...
@flash.get("success").getOrElse("Welcome!")
...
在您的Action中,指定implicit request =>如下所示:
def index = Action { implicit request =>
Ok(views.html.index())
}