使用XMLHTTPRequest(TVMLJS)发送cookie

Sca*_*aum 4 cookies xmlhttprequest tvml tvjs

我正在为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();
Run Code Online (Sandbox Code Playgroud)

但是似乎没有发送任何cookie。我还尝试用Document.cookie设置cookie,就像我可能会在“正常” js脚本中运行(在浏览器中运行)一样,但是也没有运气。

这非常令人沮丧,尤其是因为我紧紧靠近应用程序的末尾。

我猜可能是跨域的问题,但是如果我不必设置cookie,我就能获得没有问题的URL,所以我在这里有点迷路了。

请让我知道如何获取带有特定Cookie标头的http://example.com/getmovie.html

谢谢你的帮助

小智 8

抱歉,通知您,但是javascript的xmlHTTPRequest函数出于安全原因不允许设置cookie标头,如下所示:为什么在使用setRequestHeader进行xmlhttprequest时不能设置cookie和set-cookie标头?我能看到的您发出该get请求的最佳方法是运行代理服务器。我相信它是通过这种方式构建的,可以防止您在您不拥有的域上设置Cookie,此外,我看不到该问题的替代解决方案,因为我查看的文档中没有提到Cookie持久性或管理


asc*_*eta 6

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

  • @mangusta我很抱歉,但这是错误的,问题中明确设置了withCredentials,无论哪个站点都启用cookie(和授权标头)。对于同一站点,始终设置 cookie。对于其他域,您需要在 XHR 对象上将 withCredentials 设置为 true(并在服务器端处理 CORS)。 (4认同)
  • 我没有说 XMLHttpRequest 自己添加 Cookie 标头,但浏览器会这样做:https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies#Creating_cookies (3认同)

Sca*_*aum 5

如果有人遇到同样的问题:

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

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