无法从请求中读取 cookie



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

默认情况下,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)

最新更新