您好,登錄后才能下訂單哦!
session和flash scope 的區(qū)別
如果需要通過多個HTTP請求傳輸數(shù)據(jù),那么就要用到session和flash
scope。在session中存儲的,整個會話過程都有效,在flash scope
中存儲的,只是對下一個請求有效。服務(wù)器不存儲session和flash
scope中的數(shù)據(jù),它們只是被傳遞給了下一個請求,使用Cookies機(jī)制。這就意味著你只能存儲字符串類型,而且大小有限,最多4KB。Cookies的默認(rèn)名字是PLAY_SESSION,通過application.conf中的session.cookieName可以修改。
cookie的數(shù)據(jù)被標(biāo)記了一個密鑰,因此客戶端無法修改Cookies的數(shù)據(jù),否則數(shù)據(jù)會被判無效。
Play Session不被用來作為緩存,如果需要緩存一些和session相關(guān)的數(shù)據(jù),就要使用play內(nèi)置的緩存機(jī)制,在用戶的session中存儲一個unique ID來保持和特定用戶的關(guān)聯(lián)。
Session默認(rèn)沒有失效時間,除非用戶關(guān)掉瀏覽器。如果需要設(shè)定失效時間,就要在用戶session中存儲一個時間戳,不管application是否需要??梢栽赼pplication.conf中通過play.http.session.maxAge設(shè)置最長的失效時間,但也不能防止***恢復(fù)過了有效期的Cookies。
在Session中存儲數(shù)據(jù)
由于Session只是Cookie,同時也只是一個HTTP的頭部,你可以用與處理請求結(jié)果相同的方式處理session的數(shù)據(jù):
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有兩點不同:
數(shù)據(jù)只在一個請求中保留,另一點是Flash cookie沒有標(biāo)記,用戶可以修改它。
Flash scope只能在沒有Ajax的applications中傳輸success/error信息,由于數(shù)據(jù)只在一個請求中并且在復(fù)雜web應(yīng)用中不能保證請求的順序,因此它受到競爭條件的約束。
使用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參數(shù),具體操作如下:
@()(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在范圍內(nèi)沒有隱式的請求。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。