文档

§会话和闪存范围

§Play 中的不同之处

如果您需要在多个 HTTP 请求之间保留数据,可以将它们保存在会话或闪存范围内。存储在会话中的数据在整个用户会话期间可用,而存储在闪存范围中的数据仅在下一个请求中可用。

§使用 Cookie

重要的是要了解会话和闪存数据不是存储在服务器中,而是使用 HTTP Cookie 添加到每个后续 HTTP 请求中。

由于会话和闪存是使用 Cookie 实现的,因此有一些重要的影响。

最后一点可能会造成混淆。当您修改 Cookie 时,您是在向响应提供信息,Play 必须再次解析它才能看到更新的值。如果您想确保会话信息是最新的,那么您应该始终将会话修改与重定向配对。

会话 Cookie 使用密钥进行签名,因此客户端无法修改 Cookie 数据(否则它将被失效)。

Play 会话不打算用作缓存。如果您需要缓存与特定会话相关的一些数据,可以使用 Play 内置的缓存机制,并使用会话存储唯一的 ID 以将缓存数据与特定用户关联。

§会话配置

Cookie 的默认名称为 PLAY_SESSION。可以通过在 application.conf 中配置键 play.http.session.cookieName 来更改此名称。

如果更改了 Cookie 的名称,可以使用 设置和丢弃 Cookie 中提到的相同方法丢弃之前的 Cookie。

有关如何在 application.conf 中配置会话 Cookie 参数的更多信息,请参阅 配置会话 Cookie

§会话超时/过期

默认情况下,会话没有技术上的超时。它在用户关闭 Web 浏览器时过期。如果需要为特定应用程序设置功能性超时,可以通过在 application.conf 中配置键 play.http.session.maxAge 来设置会话 Cookie 的最大生存期,这也会将 play.http.session.jwt.expiresAfter 设置为相同的值。maxAge 属性将从浏览器中删除 Cookie,并且 JWT exp 声明将设置在 Cookie 中,并在给定持续时间后使其失效。有关更多信息,请参阅 配置会话 Cookie

§将数据存储到会话中

由于会话只是一个 Cookie,它也是一个 HTTP 标头,但 Play 提供了一个辅助方法来存储会话值

public Result login(Http.Request request) {
  return redirect("/home")
      .addingToSession(request, "connected", "[email protected]");
}

同样,您可以从传入的会话中删除任何值

public Result logout(Http.Request request) {
  return redirect("/home").removingFromSession(request, "connected");
}

§读取会话值

您可以从 HTTP 请求中检索传入的会话

public Result index(Http.Request request) {
  return request
      .session()
      .get("connected")
      .map(user -> ok("Hello " + user))
      .orElseGet(() -> unauthorized("Oops, you are not connected"));
}

§丢弃整个会话

如果要丢弃整个会话,可以使用特殊操作

public Result logout() {
  return redirect("/home").withNewSession();
}

§闪存范围

闪存范围的工作原理与会话完全相同,但有一个区别

重要:闪存范围仅应用于在简单的非 Ajax 应用程序上传输成功/错误消息。由于数据仅保留到下一个请求,并且没有保证在复杂的 Web 应用程序中确保请求顺序,因此闪存范围容易出现竞争条件。

例如,在保存项目后,您可能希望将用户重定向回索引页面,并且您可能希望在索引页面上显示一条消息,说明保存成功。在保存操作中,您将成功消息添加到闪存范围

public Result save() {
  return redirect("/home").flashing("success", "The item has been created");
}

然后在 index 操作中,你可以检查 flash 范围中是否存在成功消息,如果存在,则渲染它。

public Result index(Http.Request request) {
  return ok(request.flash().get("success").orElse("Welcome!"));
}

闪存值也可以在 Twirl 模板中自动使用。例如

@flash.get("success").orElse("Welcome!")

下一步:正文解析器


发现此文档中的错误?此页面的源代码可以在 这里 找到。阅读完 文档指南 后,请随时贡献拉取请求。有疑问或建议要分享?前往 我们的社区论坛 与社区开始对话。