如果你必须在多个http请求中保存数据,你可以保存它们在session和flash范围之内,存储在会话中的数据在整个会话中都是有效的,存储在flash作用域中的数据只适用于下一个请求。
重要的是要了解会话和flash数据不存储在服务器中,而是使用cookie将其添加到每个后续HTTP请求中。,这意味着数据的大小非常有限(最多4KB),并且只能存储字符串值;
Cookie是一个用秘钥签名的,因此客户端不能修改Cookie的值(否则它将失效),Play会话不会用作缓存,如果需要缓存与特定会话相关的数据,你可以使用Play内置缓存机制并使用会话存储一个唯一的ID来将缓存数据与特定用户关联。
注意:会话没有技术上的超时,只有当用户关闭web浏览器时会话才会过期,如果您需要某个特定应用程序的功能超时,只需在用户会话中存储一个时间戳,然后在应用程序需要时使用它。
读取一个session值
你可以从http请求检索接收到的会话,
public static Result index() {
String user = session("connected");
if(user != null) {
return ok("Hello " + user);
} else {
return unauthorized("Oops, you are not connected");
}
}
将数据存入session会话
因为会话只是一个cookie,他也是一个http头,但是play提供一个帮助方法存储session值。
public static Result index() {
session("connected", "user@gmail.com");
return ok("Welcome!");
}
同样的方法你可以删除session会话中的值:
public static Result index() {
session().remove("connected");
return ok("Bye");
}
丢弃整个会话:
public static Result index() {
session().clear();
return ok("Bye");
}
Flash范围
Flash作用域与会话完全相同,有两个不同点:
1.数据只存储一个请求范围
2.Flash cookies不做签名,用户可以做修改
重点:Flash只用作传输成功或者失败消息用在简单的非Ajax应用程序之中,由于数据只保存到下一个请求并且因为没有保证确定一个请求的顺序在一个复杂的web应用程序中,Flash范围受到条件的限制。
public static Result index() {
String message = flash("success");
if(message == null) {
message = "Welcome!";
}
return ok(message);
}
public static Result save() {
flash("success", "The item has been created");
return redirect("/home");
}