Session and Flash scope
如果想要在多次http请求间保存数据,可以将数据保存在会话或者flash scope中,保存在会话中的数据在整个用户会话期间都有效,保存在flash中的数据只在下次请求中可用。
session和flash中的数据没有保存到服务端中,而是通过cookies的方式添加到下一次的请求中,所以保存的数据十分有限(4KB)且只能保存String
Session配置
超时
通过application.conf
中的session.maxAge
可以设置超时时间,单位为秒,超过这个时间cookie会被浏览器清空,play.http.session.jwt.expiresAfter
也要设置相同的时间(2.6.10版本的start模板中没有该项配置),maxAge
会从浏览器中清除cookie信息,JWTexp
中的claim会被设置到cookie中,在超时后使cookie失效。
设置session信息
public Result login() {
session("connected", "user@gmail.com");
return ok("Welcome!");
}
从中删除一条数据
public Result logout() {
session().remove("connected");
return ok("Bye");
}
读取数据
public Result index() {
String user = session("connected");
if(user != null) {
return ok("Hello " + user);
} else {
return unauthorized("Oops, you are not connected");
}
清除整个session
public Result logout() {
session().clear();
return ok("Bye");
}
Flash scope
flash中的数据仅保存到下一个request中,且未被签名保护。因此flash仅用于在非Ajax请求中传送成功或失败信息。
一个例子
在保存一条信息后,想要将页面重定向到初始页面,并且想要在初始页面中显示一条信息表示保存成功,就可以使用flash
public Result save() {
flash("success", "The item has been created");
return redirect("/home");// /home需要在routes中配置
}
在index action中,可以检查flash中是否有success信息
public Result index() {
String message = flash("success");
if(message == null) {
message = "Welcome!";
}
return ok(message);
}
flash中的值可以被Twirl模板读取
@if(flash.containsKey("success")) {
@flash.get("success")
} else {
Welcome!
}