温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Scala下Play框架学习笔记(Session and Flash scopes)

发布时间:2020-07-27 18:17:51 来源:网络 阅读:1652 作者:金明略 栏目:开发技术

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在范围内没有隐式的请求。


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI