[翻译]Session and Flash scopes
2017-06-16 20:02
351 查看
源https://www.playframework.com/documentation/2.5.x/JavaSessionFlash
Session和Flash中的数据并不是存储在server中,而是使用Cookies添加到下一个HTTP请求中,理解这一点非常重要。这意味着数据的大小有限(最大4KB),并且你只能存储String值。
Cookies被加密,以保证客户端不会修改cookie数据。Play session不可用作缓存。如果你需要缓存某个session的相关数据,你可以使用Play內建的缓存机制,并且使用session存储唯一ID将缓存数据关联到特定用户。
注意:session有一个非技术方面的时间限制,这在用户关闭网络浏览器时可能需要。如果你需要针对某个application的时间限制,在用户Session里面存一个timestamp(例如,最大session时间,最大非活动时间)就可以了。你可以通过配置play.http.session.maxAge(ms,毫秒)设置session cookies的最大时间。但是,注意这不能阻止黑客保存重用cookie。
同样,你可以从incoming session中移除任何值。
数据只为下一个请求保存
Flash cookie没有加密,用户可以修改它
重点:flash scope只用于在简单的non-Ajax应用中传输success/error信息。因为数据仅仅为下一个请求保存,然而在复杂(组合的)Web application中不能保证请求的顺序,Flash scope会受竞争条件(race condition)影响。
例如,存储一个item之后,你可能需要将用户跳转到index页,你可能想要在index页中展示错误说明保存成功。在存储action里面,你可能添加success信息到flash scope:
在index action中,你检查success信息是否保存在flash scope内,如果成功,渲染出来:
flash值在Twirl模板中也是可用的。例如:
Play中的不同
如果你必须在多个HTTP请求中保存数据,你可以将它们保存在Session中或者Flash scope中。保存在Session中的数据在整个用户会话中都是可用的,存储在flash scope中的数据只在下一个请求中可用。Session和Flash中的数据并不是存储在server中,而是使用Cookies添加到下一个HTTP请求中,理解这一点非常重要。这意味着数据的大小有限(最大4KB),并且你只能存储String值。
Cookies被加密,以保证客户端不会修改cookie数据。Play session不可用作缓存。如果你需要缓存某个session的相关数据,你可以使用Play內建的缓存机制,并且使用session存储唯一ID将缓存数据关联到特定用户。
注意:session有一个非技术方面的时间限制,这在用户关闭网络浏览器时可能需要。如果你需要针对某个application的时间限制,在用户Session里面存一个timestamp(例如,最大session时间,最大非活动时间)就可以了。你可以通过配置play.http.session.maxAge(ms,毫秒)设置session cookies的最大时间。但是,注意这不能阻止黑客保存重用cookie。
在Session中存储数据
Session是Cookie,是HTTP首部,但是Play提供一个helper方法存储session值。public Result login() { session("connected", "user@gmail.com"); return ok("Welcome!"); }
同样,你可以从incoming session中移除任何值。
public Result logout() { session().remove("connected"); return ok("Bye"); }
读取Session值
你可以从HTTP请求中读取incoming Session:public Result index() { String user = session("connected"); if(user != null) { return ok("Hello " + user); } else { return unauthorized("Oops, you are not connected"); } }
删除整个session
如果你想要删除整个session,有一个特殊的操作:public Result logout() { session().clear(); return ok("Bye"); }
Flash scope
Flash scope与Session类似,但是有两点不同:数据只为下一个请求保存
Flash cookie没有加密,用户可以修改它
重点:flash scope只用于在简单的non-Ajax应用中传输success/error信息。因为数据仅仅为下一个请求保存,然而在复杂(组合的)Web application中不能保证请求的顺序,Flash scope会受竞争条件(race condition)影响。
例如,存储一个item之后,你可能需要将用户跳转到index页,你可能想要在index页中展示错误说明保存成功。在存储action里面,你可能添加success信息到flash scope:
public Result save() { flash("success", "The item has been created"); return redirect("/home"); }
在index action中,你检查success信息是否保存在flash scope内,如果成功,渲染出来:
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! }
相关文章推荐
- Session and Flash scopes【翻译】
- play framework2学习之旅<2.4>Session and Flash scopes
- 1.4_Session and Flash scopes
- Play 2.6 Session and Flash scope
- 翻译]JavaScript秘密花园 - scope, namespace, constructor, equality and comparisons
- spring 学习1-Request, session, and global session scopes|(Initial web configuration)
- [Play Framework]Session and Flash scopes——用Play操作Session和Flash数据
- 强化学习第二版(翻译)第一章 导论 第四节 局限性和适用范围 1.4 Limitations and Scope
- 待翻译---- Understanding Spring MVC Model and Session Attributes
- Clarifications on Flash Player for Mobile Browsers, the Flash Platform, and the Future of Flash[翻译练习]
- [翻译]JavaScript秘密花园 - scope, namespace, constructor, equality and comparisons
- [翻译]JavaScript秘密花园 - scope, namespace, constructor, equality and comparisons
- How to build and use a Flash DLL
- 10.【cocos2d翻译系列】Actions, Transformations and Effects--Special actions
- 《Visual Studio.NET Tips and Tricks》第一章的翻译
- Using Script and Style Bundles【翻译】
- 11G Concepts(翻译第九章) Data Concurrency and Consistency(数据的并发和并行)
- Flash Mobile Developing Android and iOS Applications
- Actions, Controllers and Results(翻译)
- 解决使用FireFox下Flash上传文件时SESSION丢失的问题(swfupload)