我正在帮助构建一个混合移动 Web 应用程序。主要代码库是 HTML5 和 JavaScript,将被包装在一个本地移动 Web 视图中 (类似于 Phonegap)。
应用程序的一部分功能需要将信息发布到由我们客户控制的 Web 服务中。由于该服务正在被其他人使用,因此几乎没有改变它的余地。我们使用 HTTP POST 发送 JSON 并从服务器接收响应。响应的一部分是 JSESSIONID cookie,它管理我们与服务器的会话。在初始的 initSession() 调用之后,我们需要在每个 (AJAX) 请求中发送 JSESSIONID cookie。
在移动设备上部署时,Web 应用程序被包装在本地 Web 视图中,通过浏览 file:///path/to/app/index.html 来启动 Web 应用程序。
我们尝试的第一件事是请求客户在其响应头中设置 Access-Control-Allow-Origin: *,以允许跨域资源共享 (CORS)。然后,我们尝试向服务器发送 POST 请求:
$.ajax({
url: 'http://thirdparty.com/ws',
data: data,
type: "POST",
dataType: "JSON",
success: successCallback,
error: failedCallback
});
从监控请求中可以发现,cookies没有被包含。仔细检查发现CORS规范有一个专门处理用户凭证的部分,其中包括会话cookie。因此,我修改了AJAX调用以包含它:
$.ajax({
url: 'http://thirdparty.com/ws',
data: data,
type: "POST",
dataType: "JSON",
success: successCallback,
error: failedCallback,
xhrFields { withCredentials: true }
});
浏览器出现了另一个错误。更多的阅读揭示了以下信息:
如果第三方服务器没有响应
Access-Control-Allow-Credentials: true
标头,则响应将被忽略,无法提供给 Web 内容。重要提示:在响应信任请求时,服务器必须在
Access-Control-Allow-Origin
标头中指定一个域,并且不能使用通配符。
因此,我们需要更改服务器的标头,包括将 Access-Control-Allow-Credentials: true
和 Access-Control-Allow-Origin
设置为我们的 Origin。
这里终于来到我的问题:当使用 file:// 协议加载网页时,从 Web View 发送的请求头 Origin
被设置为 null
。因此,服务器无法解析它,无法将其设置在 Access-Control-Allow-Origin
中。但是,如果服务器无法将 Access-Control-Allow-Origin
设置为除 *
之外的其他值,则我们无法发送凭据,包括 cookie。
所以我陷入了困境。怎么办呢?我在这里看到了一个类似的问题,但我不太理解提出的答案。任何帮助将不胜感激!