playframework - 无法从请求中读取 cookie

playframework - Can't read cookie from request

如何从 playframework 中的请求中获取 cookie? 我有以下测试端点

def home = Action.async { implicit request =>
    println(request)
    println(request.session)
    println(request.flash)
    request.session.get("session") match {
      case Some(cookie) => Future(Ok(cookie))
      case None =>
        Future(BadRequest(Json.obj("message" -> "missing session cookie")))
    }
  }

提交以下请求时:

curl 'http://local.example.com:9000/home' -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:76.0) Gecko/20100101 Firefox/76.0' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' -H 'Accept-Language: en-US,en;q=0.5' --compressed -H 'Connection: keep-alive' -H 'Cookie: session=eyJhbGciOiJSUzI1NiIsImtpZCI...' -H 'Upgrade-Insecure-Requests: 1' -H 'Cache-Control: max-age=0'

很遗憾,我收到了 "missing session cookie" 回复。以及控制台上的以下打印输出

GET /home
Session(Map())
Flash(Map())

我不知道我做错了什么。非常感谢任何帮助。

编辑:我使用以下方法设置 cookie:

def tokenLogin = Action(parse.json).async { implicit request =>
    val loginRequest = request.body.validate[LoginRequest]
    loginRequest.fold(
      errors =>
      {
        println(errors)
        Future(BadRequest(Json.obj("message" -> JsError.toJson(errors))))
      },
      request => {
        println("in success")
        firebaseAdminService
          .createSessionCookie(request.idToken)
          .map(sessionCookie =>
            Ok("success")
              .withNewSession
              .withCookies(Cookie(name = "session", value = sessionCookie))
          )
      }
    )
  }

默认情况下,Play中的session cookie被称为"PLAY_SESSION"(配置play.http.session.cookieName)。

因此,您需要将 -H "Cookie: PLAY_SESSION=..." 与 curl 一起使用。

但请注意,这不适用于任意数据,因为 Play 使用 JWT 并使用其加密秘密对 session cookie 中包含的信息进行签名。

唯一可行的方法是在对同一服务(具有相同的秘密)的另一个请求中使用来自您的 Play 服务的 Set-Cookie header 中收到的 session cookie .


编辑后更新

使用 request.session 时,您正在访问 session cookie,它被称为 PLAY_SESSION 以及存储在其中的信息。

但是,您正在设置自己的 cookie。这是另外一回事。

您可以使用

访问 "normal" 个 cookie
request.cookies.get("session")

哦,如果你真的想使用 session cookie,你可以这样设置:

Ok("success").withSession("session" -> sessionCookie)