如何从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))
)
}
)
}
答案 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。这是另外一回事。
您可以通过
访问“常规” Cookierequest.cookies.get("session")
哦,如果您真的想使用会话cookie,可以这样设置:
Ok("success").withSession("session" -> sessionCookie)