Scala下Play框架学习笔记(Session and Flash scopes)
admin
2023-08-01 20:00:07
0

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("Hello World!").withSession(
  request.session + ("saidHello" -> "yes"))

删除session中的元素也是用类似的方式:

Ok("Theme reset!").withSession(
  request.session - "theme")


读取Session的值

      从HTTP请求中搜索Session:

def index = Action { request =>
  request.session.get("connected").map { user =>
    Ok("Hello " + user)
  }.getOrElse {
    Unauthorized("Oops, you are not connected")
  }}

丢弃整个Session

       以下操作可以丢弃整个Session:

Ok("Bye").withNewSession


Flash Scope

      Flash Scope的工作方式和Session有两点不同:

      数据只在一个请求中保留,另一点是Flash cookie没有标记,用户可以修改它。

      Flash scope只能在没有Ajax的applications中传输success/error信息,由于数据只在一个请求中并且在复杂web应用中不能保证请求的顺序,因此它受到竞争条件的约束。

      使用Flash scope的例子如下:

def index = Action { implicit request =>
  Ok {
    request.flash.get("success").getOrElse("Welcome!")
  }}def save = Action {
  Redirect("/home").flashing(
    "success" -> "The item has been created")}


在view中搜索Flash scope的值,并且添加隐式的Flash参数,具体操作如下:

@()(implicit flash: Flash)...@flash.get("success").getOrElse("Welcome!")...


然后在Action中隐式指定implicit request =>,通过如下方式:

def index = Action { implicit request =>
  Ok(views.html.index())}

基于隐式的请求,一个隐式的Flash会被提供给view。


如果报了如下错误:

could not find implicit value for parameter flash: play.api.mvc.Flash

那说明你的Action在范围内没有隐式的请求。


相关内容

热门资讯

豌豆思维与华领人工智能签约,推... 7月9日,广州专精特新企业豌豆思维与华领人工智能集团在北京签署战略合作协议。欢乐童年CEO、豌豆思维...
海西新药:C019199片启动... 7月9日,海西新药(02637)发布公告,宣布其自主研发的C019199片正式启动针对既往至少二线治...
原创 A... 出品丨鳌头财经 面对监管新规,下线相关功能是最经济的选择。 7月4日,字节跳动旗下豆包与阿里旗下通...
以色列总理:不允许伊朗拥核 △以色列总理内塔尼亚胡(资料图)以色列总理内塔尼亚胡当地时间9日表示,无论美国和伊朗是否达成协议,以...
晋江鞋厂着火部位为1层,燃烧物... 7月9日12时4分许,位于福建泉州晋江市的辉腾鞋业有限公司发生火情,火灾发生时该厂房现场有237名本...
失守的坝,失联的人,失收的地 食通社说广西水灾救援还在继续中。在核心受灾区南宁横州,洪水横扫茉莉花、水稻、甘蔗、香蕉种植业及渔业、...
第一完成单位!隆平高科荣获20... 7月8日,2025年度国家科学技术奖励大会在北京隆重举行。由隆平高科作为第一完成单位,中信集团首席科...
2026智慧能源大会在成都开幕 成都7月9日电 (单鹏)由中国能源研究会等主办的2026智慧能源大会9日在成都开幕。本次活动汇聚来自...
国家科学技术“三大奖”揭晓,为... 7月8日,2025年度国家科学技术奖励大会在北京举行,国家自然科学奖、技术发明奖、科技进步奖“三大奖...
原创 安... 今天继续分享6月安卓性价比榜,这次的价格区间是4000元以上,性价比榜机型基于性能榜和京东自营价。比...