来自移动WebView的CORS cookie凭证在本地加载了file://

Tom*_*cer 30 javascript cookies ajax web-services cors

跟我说,这个需要一些解释.

我正在帮助构建混合移动Web应用程序.主要代码库是HTML5和JavaScript,它将包装在本机移动Web视图(一个电话空间)中.

部分功能要求应用程序将信息发布到由我们的客户控制的Web服务.由于其他人正在使用此Web服务,因此几乎没有空间可以更改此Web服务.我们使用HTTP POST发送JSON并从服务器接收响应.此响应的一部分是一个JSESSIONID cookie,用于管理与服务器的会话.在初始initSession()调用之后,我们需要使用每个(AJAX)请求发送JSESSIONID cookie.

当部署在移动设备上时,Web应用程序将包装在本机Web视图中,该视图通过浏览启动Web应用程序file:///path/to/app/index.html.

我们尝试的第一件事是要求我们的客户Access-Control-Allow-Origin: *在其响应头中设置允许CORS.然后我们尝试发布到服务器:

$.ajax({
  url: 'http://thirdparty.com/ws',
  data: data,
  type: "POST",
  dataType: "JSON",
  success: successCallback,
  error: failedCallback
});
Run Code Online (Sandbox Code Playgroud)

监控请求,显然没有包含cookie.仔细观察后,CORS规范中有一个特殊部分用于处理用户凭证,其中包括会话cookie.所以我修改了AJAX调用以包含这个:

$.ajax({
  url: 'http://thirdparty.com/ws',
  data: data,
  type: "POST",
  dataType: "JSON",
  success: successCallback,
  error: failedCallback,
  xhrFields { withCredentials: true }
});
Run Code Online (Sandbox Code Playgroud)

另一个错误,这次来自浏览器.更多阅读产生了以下内容:

如果第三方服务器没有响应Access-Control-Allow-Credentials: true标头,则响应将被忽略,并且不可用于Web内容.

重要说明:在响应凭证请求时,服务器必须在Access-Control-Allow-Origin标头中指定域,并且不能使用通配符.

因此,我们需要更改服务器的标头以包含Access-Control-Allow-Credentials: trueAccess-Control-Allow-Origin我们的Origin.

在这里,我们终于遇到了一个问题:使用file:// protocol加载网页时Origin,Web View发送的请求标头设置为null.因此无法由服务器解析,因此服务器无法将其设置为Access-Control-Allow-Origin.但是,如果服务器不能设置Access-Control-Allow-Origin到其他的东西比*我们不能发送的凭据,包括饼干.

所以我被卡住了.该怎么办?我在这里看到了一个类似的问题,但我并不理解建议的答案.任何帮助将非常感激!

J.W*_*lls 7

我意识到这个问题已经过时了,但我想我无论如何都要投入其中.在CORS请求的情况下,浏览器预检它们.这意味着 - 尽管$.ajax()您使用的OPTIONS是任何方法,但是会向服务器发送请求.

这个preflighted OPTIONS请求实际上做的是说:

"嘿那里,外来服务器来自其他域名,我想给你发一个不简单的请求(简单的请求不是预检).我的不简单的请求将有这些类型的标题和内容类型和等等.如果可以,你可以告诉我吗?"

然后服务器将执行它所做的任何事情(可能检查一些配置或数据库)并使用允许的源,允许的头和/或允许的方法进行响应.

最后 - 如果该预检OPTIONS请求收到了允许实际$.ajax()方法进行的响应- 它就会发生.

CORS与JSONP不同.

所有这一切 - 虽然withCredentials预检成功要求响应带有一个Access-Control-Allow-Credentials标题(如问题中所述),这是对Access-Control-Allow-OriginsAND Access-Control-Allow-Methods值的补充,它必须包括预期请求的方面.

例如-如果你是一个CORS POST从原产地请求http://foo-domain.com与头somevaluehttp://bar-domain.com,预检OPTIONS请求将走出去,以使实际POST请求被提出http://bar-domain.com,该OPTIONS请求将需要接收与响应Access-Control-Allow-Origins,其中包括价值http://foo-domain.com.这可能是原产地名称本身*.响应还需要包含一个Access-Control-Allow-MethodsPOST.这也可能是*.最后,如果我们希望somevalue允许我们的标头,则响应必须包含一个Access-Control-Allow-Headers包含somevalue标头键或的值*.

回滚 - 如果您无法控制服务器,或者无法允许服务器允许您的CORS请求,您可以始终使用JSONP或某些urlEncoded数据类型和/或在没有自定义标头的情况下发出简单请求.GET,HEAD和完整POST请求通常是简单的请求.

  • 附注:在响应凭证请求时,服务器必须指定域,并且不能使用通配符(`*`). (2认同)

小智 0

尝试访问 www.5app.co.uk。完全避免使用 XHR 调用,并在数据连接出现和消失时在移动设备上可靠地工作。然后网关与您的客户端进行交互。