使用XMLHTTPRequest发送cookie(TVMLJS)

时间:2017-02-15 22:00:28

标签: cookies xmlhttprequest tvml tvjs

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

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

我尝试过使用setRequestHeader:

var xhr = new XMLHttpRequest();
xhr.open("GET", url, false);
xhr.withCredentials = true;
xhr.setRequestHeader('Cookie', 'mycookie=cookie');
xhr.send();

但似乎没有发送cookie。 我也尝试使用Document.cookie设置cookie,就像我可能在" normal" js脚本(在我的浏览器中运行)但也没有运气。

这非常令人沮丧,特别是因为我已经非常接近我的应用程序结束了。

我猜交叉来源可能是个问题,但如果我不必设置Cookie,我就可以毫无问题地获取网址,所以我在那里有点迷失。

请告诉我如何通过特定的Cookie标题获取http://example.com/getmovie.html

感谢您的帮助

5 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

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

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

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

答案 2 :(得分: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');

答案 3 :(得分:0)

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

答案 4 :(得分:-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;