【问题标题】:playframework - Can't read cookie from requestplayframework - 无法从请求中读取 cookie
【发布时间】:2020-05-14 04:40:26
【问题描述】:

如何从 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))
          )
      }
    )
  }

【问题讨论】:

  • 谨防公开发布 JWT 数据,因为这些数据可能包含敏感信息(例如您的电子邮件地址)

标签: session playframework session-cookies


【解决方案1】:

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

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

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

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


修改后更新

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

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

您可以使用

访问“普通”cookie
request.cookies.get("session")

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

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

【讨论】:

  • 我知道默认名称是 PLAY_SESSION,但我使用 .withCookies(Cookie(name = "session", value = sessionCookie)) 设置了 cookie。所以cookie应该在那里。我也添加了添加会话cookie的方法这个问题。如果您有其他想法,请告诉我。
猜你喜欢
  • 2017-05-17
  • 2022-01-07
  • 2012-05-22
  • 2021-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多