Scala下Play框架学习笔记(Session and Flash scopes)
session和flash scope 的区别
如果需要通过多个HTTP请求传输数据,那么就要用到session和flash scope。在session中存储的,整个会话过程都有效,在flash scope 中存储的,只是对下一个请求有效。服务器不存储session和flash scope中的数据,它们只是被传递给了下一个请求,使用Cookies机制。这就意味着你只能存储字符串类型,而且大小有限,最多4KB。Cookies的默认名字是PLAY_SESSION,通过application.conf中的session.cookieName可以修改。
cookie的数据被标记了一个密钥,因此客户端无法修改Cookies的数据,否则数据会被判无效。
Play Session不被用来作为缓存,如果需要缓存一些和session相关的数据,就要使用play内置的缓存机制,在用户的session中存储一个unique ID来保持和特定用户的关联。
Session默认没有失效时间,除非用户关掉浏览器。如果需要设定失效时间,就要在用户session中存储一个时间戳,不管application是否需要。可以在application.conf中通过play.http.session.maxAge设置最长的失效时间,但也不能防止***恢复过了有效期的Cookies。
在Session中存储数据
由于Session只是Cookie,同时也只是一个HTTP的头部,你可以用与处理请求结果相同的方式处理session的数据:
Ok("Welcome!").withSession("connected"->"user@gmail.com")
在已有的session中添加一个元素,并且生成新session的方式如下:
Ok("HelloWorld!").withSession(request.session+("saidHello"->"yes"))
删除session中的元素也是用类似的方式:
Ok("Themereset!").withSession(request.session-"theme")
读取Session的值
从HTTP请求中搜索Session:
defindex=Action{request=>request.session.get("connected").map{user=>Ok("Hello"+user)}.getOrElse{Unauthorized("Oops,youarenotconnected")}}
丢弃整个Session
以下操作可以丢弃整个Session:
Ok("Bye").withNewSession
Flash Scope
Flash Scope的工作方式和Session有两点不同:
数据只在一个请求中保留,另一点是Flash cookie没有标记,用户可以修改它。
Flash scope只能在没有Ajax的applications中传输success/error信息,由于数据只在一个请求中并且在复杂web应用中不能保证请求的顺序,因此它受到竞争条件的约束。
使用Flash scope的例子如下:
defindex=Action{implicitrequest=>Ok{request.flash.get("success").getOrElse("Welcome!")}}defsave=Action{Redirect("/home").flashing("success"->"Theitemhasbeencreated")}
在view中搜索Flash scope的值,并且添加隐式的Flash参数,具体操作如下:
@()(implicitflash:Flash)...@flash.get("success").getOrElse("Welcome!")...
然后在Action中隐式指定implicit request =>,通过如下方式:
defindex=Action{implicitrequest=>Ok(views.html.index())}
基于隐式的请求,一个隐式的Flash会被提供给view。
如果报了如下错误:
‘could not find implicit value for parameter flash: play.api.mvc.Flash’
那说明你的Action在范围内没有隐式的请求。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。