playframework-无法从请求中读取Cookie

时间:2020-05-11 21:13:46

标签: session playframework session-cookies

如何从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'

很不幸,我收到了“缺少会话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))
          )
      }
    )
  }

1 个答案:

答案 0 :(得分:1)

默认情况下,Play中的会话Cookie称为“ PLAY_SESSION”(配置play.http.session.cookieName)。

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

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

唯一可行的方法是使用Set-Cookie标头中从您的Play服务收到的会话Cookie,该请求是在对同一服务(具有相同秘密)的另一个请求中使用的。


编辑后更新

使用request.session时,您正在访问会话cookie(称为PLAY_SESSION)和其中存储的信息。

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

您可以通过

访问“常规” Cookie
request.cookies.get("session")

哦,如果您真的想使用会话cookie,可以这样设置:

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