我正在为我的 AppleTV 开发一个应用程序。该应用程序将从尚未开发任何 API 的在线网站读取电影。
我使用 XMLHTTPRequest 获取不同的 URL 并让用户搜索他的电影等...除了单个请求之外,一切都工作正常。要获取电影 URL,我必须使用常量 cookie(假设 mycookie=cookie)向特定地址(假设 http://example.com/getmovie.html)发送 get 请求。
我尝试过使用setRequestHeader:
var xhr = new XMLHttpRequest();
xhr.open("GET", url, false);
xhr.withCredentials = true;
xhr.setRequestHeader('Cookie', 'mycookie=cookie');
xhr.send();
但是似乎没有发送cookie。 我还尝试使用 Document.cookie 设置 cookie,就像我可能在“正常”js 脚本(在我的浏览器中运行)中所做的那样,但也没有运气。
这非常令人沮丧,尤其是因为我已经快要结束应用程序了。
我猜跨源可能是问题所在,但如果我不必设置 cookie,我就可以毫无问题地获取 URL,所以我有点迷失了。
请让我知道如何使用特定的 cookie 标头获取 http://example.com/getmovie.html。
感谢您的帮助
很遗憾地通知您,出于安全原因,javascript 的 xmlHTTPRequest 函数不允许设置 cookie 标头,如下所示:为什么在使用 setRequestHeader 进行 xmlhttprequest 时不能设置 cookie 和 set-cookie 标头? 最好我可以看到您发出该获取请求的方式是向您将运行的代理服务器发出请求。我相信它的构建方式是为了防止您在不属于您的域上设置 cookie,此外,我没有看到此问题的替代解决方案,因为我查看的文档中没有提到 cookie 持久性或管理
好吧...这里的问题是
xhr.setRequestHeader('Cookie', 'mycookie=cookie');
行,因为“Cookie”标头是为客户端浏览器保留的,用于发送存储的cookie。这意味着您正在尝试执行浏览器已经执行的操作。当您发送任何请求时,客户端浏览器会自动获取与您请求的站点相关的所有 cookie,并将它们放在“Cookie”标头中,如果您的 cookie 存在于您的浏览器中,您无需执行任何其他操作,将会发送。
如果有人有同样的问题:
我没有找到用javascript发送cookie的解决方案。然而,在我的情况下,请求的来源并不重要,只有 cookie 才重要。我的解决方案是创建一个 PHP 文件,接收目标 URL 和 cookie 内容作为参数,然后使用 cookie 作为请求标头发送 get 请求。 (有关如何执行此操作的更多信息,请参见:PHP GET 请求,发送标头)。
在我的 javascript 中,我使用 XMLHttpRequest 通过简单的获取参数连接到我的 PHP 文件(在线托管),然后接收来自 PHP 的响应。如果请求的来源很重要,那么这个技巧当然不会起作用(除非你在家里托管文件,但就我而言,即使我的 WAMP 未打开,我也希望我的应用程序能够工作)。
Cordova 如何发送会话 cookie,允许使用 XMLhttprequest 的凭据:
// JS
var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://example.com/ajax.php', true);
xhr.withCredentials = true;
xhr.onreadystatechange = function() {
if(xhr.readyState == 4 && xhr.status == 200) {
// alert(xhr.responseText);
// Get header from php server request if you want for something
var cookie = xhr.getResponseHeader("Cookie");
// alert("Cookie: " + cookie);
}
}
xhr.send();
// Php
// You can add cookie to header and get with (session works without it)
header('Cookie: PHPSESSID='.$_COOKIE['PHPSESSID']);
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
header('Access-Control-Allow-Headers: Origin, Content-Type, Accept, Authorization, X-Request-With, Set-Cookie, Cookie, Bearer');
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Max-Age: 86400');
可以通过添加xhr.withCredentials = true;来解决