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)
如何从 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" 个 cookierequest.cookies.get("session")
哦,如果你真的想使用 session cookie,你可以这样设置:
Ok("success").withSession("session" -> sessionCookie)