4、Session and Flash scopes

不同之处

如果必须跨多个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())
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值