§Session 和 Flash 範圍
§在 Play 中的不同之處
如果您必須在多個 HTTP 要求中保留資料,您可以將它們儲存在 Session 或 Flash 範圍中。儲存在 Session 中的資料在整個使用者會話期間都可用,而儲存在 Flash 範圍中的資料僅在下一個要求中可用。
§使用 Cookie
了解 Session 和 Flash 資料並非儲存在伺服器中,而是使用 HTTP Cookie 加入到每個後續 HTTP 要求中,這一點很重要。
因為 Session 和 Flash 是使用 Cookie 實作的,所以有一些重要的影響。
- 資料大小非常有限(最多 4 KB)。
- 您只能儲存字串值,儘管您可以將 JSON 序列化到 Cookie 中。
- Cookie 中的資訊對瀏覽器可見,因此可能會揭露敏感資料。
- Cookie 資訊對於原始要求是不可變的,而且僅供後續要求使用。
最後一點可能會造成混淆。當您修改 Cookie 時,您會提供資訊給回應,而 Play 必須再次解析它,以查看更新的值。如果您想要確保目前的資訊是目前的,則您應該總是將修改的資訊與重新導向配對。
會話 Cookie 會使用一個機密金鑰進行簽署,因此客戶端無法修改 Cookie 資料(或它將會失效)。
Play 會話並非用於做為快取。如果您需要快取與特定會話相關的資料,您可以使用 Play 內建的快取機制,並使用會話來儲存一個唯一的 ID,以將快取資料與特定使用者關聯在一起。
§會話組態
Cookie 的預設名稱為 PLAY_SESSION
。這可以透過在 application.conf 中組態金鑰 play.http.session.cookieName
來變更。
如果變更 Cookie 的名稱,可以使用 設定和捨棄 Cookie 中所述的相同方法來捨棄較早的 Cookie。
請參閱 組態會話 Cookie,以取得有關如何在 application.conf
中組態會話 Cookie 參數的更多資訊。
§會話逾時 / 到期
預設情況下,Session 沒有技術超時時間。它會在使用者關閉網路瀏覽器時到期。如果您需要特定應用程式的功能超時時間,請透過在 application.conf
中設定金鑰 play.http.session.maxAge
來設定 session cookie 的最長存活時間,這也會將 play.http.session.jwt.expiresAfter
設定為相同的值。maxAge
屬性會從瀏覽器中移除 cookie,而 JWT exp
宣告會設定在 cookie 中,並在給定的時間後使其失效。請參閱 設定 Session Cookie 以取得更多資訊。
§將資料儲存在 Session 中
由於 Session 僅是一個 Cookie,它也只是一個 HTTP 標頭,但 Play 提供一個輔助方法來儲存 session 值
public Result login(Http.Request request) {
return redirect("/home")
.addingToSession(request, "connected", "[email protected]");
}
同樣地,您可以從輸入的 session 中移除任何值
public Result logout(Http.Request request) {
return redirect("/home").removingFromSession(request, "connected");
}
§讀取 Session 值
您可以從 HTTP 要求中擷取輸入的 Session
public Result index(Http.Request request) {
return request
.session()
.get("connected")
.map(user -> ok("Hello " + user))
.orElseGet(() -> unauthorized("Oops, you are not connected"));
}
§捨棄整個 session
如果您想捨棄整個 session,有一個特殊操作
public Result logout() {
return redirect("/home").withNewSession();
}
§Flash 範圍
Flash 範圍的運作方式與 Session 完全相同,只有一個差異
- 資料僅保留一個要求
重要:Flash 範圍應僅用於在簡單的非 Ajax 應用程式上傳輸成功/錯誤訊息。由於資料僅保留到下一個要求,且無法保證複雜的 Web 應用程式中的要求順序,因此 Flash 範圍會受到競爭條件影響。
例如,在儲存項目後,您可能想將使用者重新導向回索引頁面,並可能想在索引頁面上顯示訊息,表示儲存成功。在儲存動作中,您會將成功訊息新增至快閃範圍
public Result save() {
return redirect("/home").flashing("success", "The item has been created");
}
然後在索引動作中,您可以檢查成功訊息是否存在於快閃範圍中,如果存在,則呈現它
public Result index(Http.Request request) {
return ok(request.flash().get("success").orElse("Welcome!"));
}
快閃值也會自動出現在 Twirl 範本中。例如
@flash.get("success").orElse("Welcome!")
下一步:主體剖析器
在此文件檔中找到錯誤?此頁面的原始程式碼可以在 這裡 找到。在閱讀 文件檔指南 後,請隨時貢獻一個拉取請求。有問題或建議想分享?前往 我們的社群論壇 與社群展開對話。