【二 HTTP编程】4. Session和Flash做用域

Play的特殊之处

当你须要跨多个HTTP请求来共享数据时,你能够将它们保存在Session或者Flash域中。Session中的数据在user Session整个周期有效,而Flash域中的数据仅仅保存至下一个request请求。html

很重要的一个概念,是Session和Flash的数据并不禁服务器保存,而是在各个HTTP请求中被添加到cookie里。这意味着数据量不能太大(小于4Kb)并且仅仅只能保存String格式的数据。默认的cookie名称是 PLAY_SESSION。固然你能够在 application.conf 中修改 play.http.session.cookieName来改变默认值。web

若是cookie名称被改变了,先前的cookie能够经过上一章提到过的方法来删除。编程

固然,cookie的值由一个secret签名来保证不被客户端修改(不然cookie将会失效)。api

Play Session并非用来当作缓存的。若是你须要将某些数据缓存到关联的Session中,你可使用Play内置的缓存机制,并在用户Session中保存关联用户缓存的惟一ID。浏览器

Session设置

请移步Configuring Session Cookies查看application.conf中session cookie的更多设置。缓存

Session超时/失效

默认的,Session没有超时时间。它将在用户关闭浏览器时失效。若是你须要一个可编程的超时时间,能够经过在 application.conf 设置 play.http.session.maxAge 来限定,此配置会将 play.http.session.jwt.expiresAfter 设置为一样的值。maxAge 将从浏览器移除cookie,同时JWT的 exp 将在cookie中被设置,并在超时后将其失效。移步这里查看更多信息。服务器

在Session中保存数据

Session仅仅是一个Cookie而已,所以它也是一个HTTP Header。你能够像操做其余Header同样操做它:cookie

Ok("Welcome!").withSession(
    "connected" -> "user@gmail.com")

注意上面的操做会替换整个session,若是你只是须要向一个已有的Session添加一个元素,你能够在传入的Session中添加一个元素,而后将它指定为一个新的Session:session

Ok("Hello World!").withSession(request.session + ("saidHello" -> "yes"))

你也能够经过这种方式来从Session中删除数据:mvc

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

读取Session值

从HTTP 请求中取得一个Session:

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

丢弃整个Session

有一个特殊的方法来丢弃整个Session:

Ok("Bye").withNewSession

Flash域

Flash几乎和Session如出一辙,只有两点区别:

  • 数据仅仅保存一个request
  • Flash cookie没有被签名,便于用户修改

重要: Flash域应该仅仅在非Ajax应用中传递success/error消息。由于在复杂的web应用中没有任何request顺序的保证,Flash域可能会面临不少竞争性条件。

下面是一些Flash域的例子:

def index = Action { implicit request =>
    Ok {
        request.flash.get("success").getOrElse("Welcome!")
    }
}

def save = Action {
    Redirect("/home").flashing(
    "success" -> "The item has been created")
}

你能够增长一个implicit的Flash参数,以便在view中获取Flash域的值:

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

并在Action中,指定一个 implicit request => :

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

一个隐式的Flash将在view中随着隐式的request一块儿提供。

若是看到'could not find implicit value for parameter flash: play.api.mvc.Flash' 的错误提示,说明你的Action在当前域没有找到隐式的request。

相关文章
相关标签/搜索