WSResponse转Result丢失会话键值对,如何找回并用于后续请求?
问题分析与解决
原因说明
你看不到会话键值对的核心原因是:Play框架的会话机制依赖加密Cookie实现,addingToSession方法并没有把"Key"->"Value"直接写入响应体,而是将其加密后存入名为PLAY_SESSION的Cookie中,通过响应的Set-Cookie头发送给客户端。而WSResponse不会自动解析解密Cookie里的会话内容,只会把Cookie作为独立对象存放在cookies集合里,所以你直接在响应体或常规字段里找不到这个键值对。
恢复/使用会话数据的方法
要在后续WSRequest中复用这个会话,只需要传递响应返回的会话Cookie即可,步骤如下:
- 发起请求获取
WSResponse后,从中提取会话Cookie:
val response: WSResponse = await(ws.url("/endpoint").get()) // 默认会话Cookie名为PLAY_SESSION,可在Play配置中修改 val sessionCookie = response.cookies.find(_.name == "PLAY_SESSION")
- 后续请求时,将该Cookie添加到
WSRequest中:
val nextRequest = ws.url("/another-endpoint") sessionCookie.foreach(cookie => nextRequest.addCookie(cookie)) val nextResponse = await(nextRequest.get())
这样后续请求就会带上之前的会话数据,服务端就能识别到"Key"->"Value"。
关于Result与WSResponse的对应关系
Play的Result是服务端构建的响应模型,包含状态码、响应头、Cookie、响应体等所有响应信息。当它被发送给客户端后,会被转换为标准的HTTP响应,而WSResponse就是客户端对这个HTTP响应的封装:
Result中通过addingToSession添加的会话数据,会被加密后生成Set-Cookie响应头WSResponse会解析这个头,将其转化为WSCookie对象存入cookies集合- 你不需要把
WSRequest解析为Result,这是完全错误的方向,核心是处理WSResponse中的Cookie
内容的提问来源于stack exchange,提问作者ryupark1321
相关产品推荐
相关产品推荐

