Scala.JS 中的会话(和播放)
Sessions in Scala.JS (and Play)
我想在 web-app 中进行非常简单的用户身份验证,它是用 Scala.JS 编写的,其后端是在 Play 2.6 中实现的。
使用 Scala.JS RosHTTP-library,我的 user-client 创建对表单服务器的请求:
HttpRequest("http://localhost:9000/lookup")
.withQueryParameters(("tag1", input1), ("tag2", input2))
.send()
.onComplete({
case response: Success[SimpleHttpResponse] => {
...
})
服务器然后像这样响应:
Ok(resultSet.asJson.toString())
.withCookies(Cookie("connected", "blue", httpOnly = false))
但是,使用上述代码时,客户端似乎不会将收到的cookie添加到后续请求中。 RosHTTP 文档还提到了手动 set/send cookie 的可能性,但是由于 header 被禁止,这将添加到 browser-failure(根据规范,这是正确的!):
request.withHeaders("Cookie" -> "connected=blue")
有趣的是,当我直接使用 org.scalajs.dom.XMLHttpRequest
而没有像 RosHTTP 这样的精美包装器时,我可以执行以下操作:
val request = new XMLHttpRequest()
request.open("GET", "http://localhost:9000/lookup?tag1=input1")
request.withCredentials = true
request.onload = { ... }
request.send()
这有效地使浏览器将之前收到的 cookie 附加到此请求(注意此处的 withCredentials
位!),正如我希望的那样。
但这并不令人满意,因此我的问题是:在 RosHTTP 中真的没有办法实现同样的目标吗?我真的必须直接使用 XMLHttpRequest
-stuff 而不使用任何花哨的包装器吗?或者使用 Scala.JS(和 Play)实现非常 bare-bones session 管理系统的惯用方法是什么? (顺便说一句,在 Play-side 上,我也尝试过 withSession
而不是 withCookie
但无济于事。)
谜团解开了:问题是我基本上是在使用 cookie 进行 跨站点请求,出于安全原因,这绝对需要设置上述布尔值 属性, withCredentials
, 在底层传输层。设置它的可能性现已添加到 RosHTTP 库中。
重要的是要注意,对于同站点请求,此标志 is/was 不是必需的,设置或取消设置也没有区别。
我想在 web-app 中进行非常简单的用户身份验证,它是用 Scala.JS 编写的,其后端是在 Play 2.6 中实现的。
使用 Scala.JS RosHTTP-library,我的 user-client 创建对表单服务器的请求:
HttpRequest("http://localhost:9000/lookup")
.withQueryParameters(("tag1", input1), ("tag2", input2))
.send()
.onComplete({
case response: Success[SimpleHttpResponse] => {
...
})
服务器然后像这样响应:
Ok(resultSet.asJson.toString())
.withCookies(Cookie("connected", "blue", httpOnly = false))
但是,使用上述代码时,客户端似乎不会将收到的cookie添加到后续请求中。 RosHTTP 文档还提到了手动 set/send cookie 的可能性,但是由于 header 被禁止,这将添加到 browser-failure(根据规范,这是正确的!):
request.withHeaders("Cookie" -> "connected=blue")
有趣的是,当我直接使用 org.scalajs.dom.XMLHttpRequest
而没有像 RosHTTP 这样的精美包装器时,我可以执行以下操作:
val request = new XMLHttpRequest()
request.open("GET", "http://localhost:9000/lookup?tag1=input1")
request.withCredentials = true
request.onload = { ... }
request.send()
这有效地使浏览器将之前收到的 cookie 附加到此请求(注意此处的 withCredentials
位!),正如我希望的那样。
但这并不令人满意,因此我的问题是:在 RosHTTP 中真的没有办法实现同样的目标吗?我真的必须直接使用 XMLHttpRequest
-stuff 而不使用任何花哨的包装器吗?或者使用 Scala.JS(和 Play)实现非常 bare-bones session 管理系统的惯用方法是什么? (顺便说一句,在 Play-side 上,我也尝试过 withSession
而不是 withCookie
但无济于事。)
谜团解开了:问题是我基本上是在使用 cookie 进行 跨站点请求,出于安全原因,这绝对需要设置上述布尔值 属性, withCredentials
, 在底层传输层。设置它的可能性现已添加到 RosHTTP 库中。
重要的是要注意,对于同站点请求,此标志 is/was 不是必需的,设置或取消设置也没有区别。