Scala.JS中的会话(和播放)

时间:2018-10-20 15:40:13

标签: playframework session-cookies scala.js

我想在使用Scala.JS编写的Web应用程序中获得非常简单的用户身份验证,其后端在Play 2.6中实现。

使用Scala.JS RosHTTP-library,我的用户客户端以以下形式向服务器创建请求:

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文档还提到了可以手动设置/发送cookie的可能性,但是由于禁止标头(根据规范,正确的做法是这样),这会增加浏览器的故障:

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)实现非常简单的会话管理系统的理想方式? (顺便说一句,在Play端,我也尝试使用withSession而不是withCookie,但无济于事。)

1 个答案:

答案 0 :(得分:0)

一个谜解决了:问题是我基本上是使用Cookie发出跨站点请求,出于安全原因,这绝对需要在其中设置上述布尔属性withCredentials基础运输层。设置它的可能性现在已经添加到RosHTTP库中。

重要的是要注意,对于同一站点的请求,不需要/不需要此标志,设置或取消设置它也不会有所不同。