12

我正在为我的 AppleTV 开发一个应用程序。该应用程序将从尚未为此类事物开发任何 API 的在线网站读取电影。

我使用 XMLHTTPRequest 来获取不同的 URL,并让用户搜索他的电影等……一切都很好,除了一个请求。要获取电影 URL,我必须使用常量 cookie(比如 mycookie=cookie)向特定地址(比如http://example.com/getmovie.html )发送获取请求。

我试过使用 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 。

谢谢你的帮助

4

5 回答 5

9

很抱歉通知您,但出于安全原因,javascript 的 xmlHTTPRequest 函数不允许设置 cookie 标头,如下所示:Why cookies and set-cookie headers can't be set while making xmlhttprequest using setRequestHeader? 我可以看到您发出该获取请求的最佳方式是您将运行的代理服务器。我相信它是以这种方式构建的,以防止您在您不拥有的域上设置 cookie,此外,我没有看到此问题的替代解决方案,因为在我查看的文档中没有提到 cookie 持久性或管理

于 2017-02-15T23:25:35.213 回答
5

嗯...这里的问题是xhr.setRequestHeader('Cookie', 'mycookie=cookie');行,因为“Cookie”标头是为客户端浏览器保留的,用于发送存储的 cookie。这意味着您正在尝试做浏览器已经做的事情。当您发送任何请求时,客户端浏览器会自动获取与您请求的站点相关的所有 cookie 并将它们放在“Cookie”标题中,如果您的 cookie 存在于您的浏览器中,您无需执行任何其他操作,它将被发送。

于 2019-09-30T18:26:48.343 回答
4

如果有人有同样的问题:

我没有找到使用 javascript 发送 cookie 的解决方案。但是,在我的情况下,请求的来源并不重要,只有 cookie 才重要。然后我的解决方案是创建一个 PHP 文件,接收目标 URL 和 cookie 内容作为参数,然后发送带有 cookie 作为请求标头的 get 请求。(有关如何在此处执行此操作的更多信息:PHP GET 请求,发送标头)。

然后在我的 javascript 中,我使用 XMLHttpRequest 通过简单的 get 参数连接到我的 PHP 文件(在线托管),然后我收到来自 PHP 的响应。如果请求的来源很重要,那么这个技巧当然不会起作用(除非你在家中托管你的文件,但在我的情况下,即使我的 WAMP 没有打开,我也希望我的应用程序能够工作)。

于 2017-02-16T12:56:21.880 回答
1

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');
于 2018-07-18T07:20:38.783 回答
-2

解决此问题的方法是将 cookie 编码到请求的 URL 中,作为代理服务器的参数,从而绕过XMLHttpRequest标头的安全性。

例子:

xhr.open("GET", url+’?’+encodeURI(document.cookie), false);

只要您的代理在根 URI 处打开,它就可以拦截会话 cookie(可以使用 进行解析decodeURI)。

如果您让浏览器执行请求而不是XMLHttpRequest(但是在同一个 TLD 中),您也可以自动发送 cookie 标头 - 但是这对 UX 来说不是很好,但是如果您不执行 COR,我将其作为替代方案展示. 它起作用的原因是浏览器对 cookie 标头没有限制。

例子:

document.location.href = url;
于 2020-03-08T15:14:55.547 回答