文件

§Session 和 Flash 範圍

§在 Play 中的不同之處

如果您必須在多個 HTTP 要求中保留資料,您可以將它們儲存在 Session 或 Flash 範圍中。儲存在 Session 中的資料在整個使用者會話期間都可用,而儲存在 Flash 範圍中的資料僅在下一個要求中可用。

§使用 Cookie

了解 Session 和 Flash 資料並非儲存在伺服器中,而是使用 HTTP Cookie 加入到每個後續 HTTP 要求中,這一點很重要。

因為 Session 和 Flash 是使用 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!")

下一步:主體剖析器


在此文件檔中找到錯誤?此頁面的原始程式碼可以在 這裡 找到。在閱讀 文件檔指南 後,請隨時貢獻一個拉取請求。有問題或建議想分享?前往 我們的社群論壇 與社群展開對話。