我想在使用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
,但无济于事。)
答案 0 :(得分:0)
一个谜解决了:问题是我基本上是使用Cookie发出跨站点请求,出于安全原因,这绝对需要在其中设置上述布尔属性withCredentials
基础运输层。设置它的可能性现在已经添加到RosHTTP库中。
重要的是要注意,对于同一站点的请求,不需要/不需要此标志,设置或取消设置它也不会有所不同。