Session 和 Flash 域
Session 和 Flash 数据不是由服务器来存储,而是以 Cookie 机制添加到每一次后续的 HTTP 请求。这也就意味着数据的大小是很受限的(最多 4KB),而且你只能存储字符串类型的值。在 Play 中默认的 Cookie 名称是 。默认的名称可以在 application.conf 中通过配置 session.cookieName
的值来修改。
当然了,Cookie 值是由密钥签名了的,这使得客户端不能修改 Cookie 数据(否则它会失效)。
Play 的 Session 不能当成缓存来用。假如你需要缓存与某一会话相关的数据,你可以使用 Play 内置的缓存机制并在用户会话中存储一个唯一的 ID 与之关联。
由于 Session 是个 Cookie 也是个 HTTP 头,所以你可用操作其他 Result 属性那样的方式操作 Session 数据:
这会替换掉整个 Session。假如你需要添加元素到已有的 Session 中,方法是先添加元素到传入的 Session 中,接着把它作为新的 Session:
Ok("Hello World!").withSession(
request.session + ("saidHello" -> "yes"))
你可以用同样的方式从传入的 Session 中移除任何值:
你可以从 HTTP 请求中取回传入的 Session:
def index = Action { request =>
Ok("Hello " + user)
}.getOrElse {
}
}
Flash 域工作方式非常像 Session,但有两点不同:
- 数据仅为一次请求而保留。
- Flash 的 Cookie 未被签名,这留给了用户修改它的可能。
下面是一些使用 Flash 域的例子:
def index = Action { implicit request =>
request.flash.get("success").getOrElse("Welcome!")
}
}
def save = Action {
Redirect("/home").flashing(
"success" -> "The item has been created")
}
为了在你的视图中使用 Flash 域,需要加上 Flash 域的隐式转换:
如果出现 could not find implicit value for parameter flash: play.api.mvc.Flash
的错误,像下面这样加上 就解决了: