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 不是必需的,设置或取消设置也没有区别。