web-dev-qa-db-ja.com

JavaScriptまたはその他を使用して、異なるドメインにCookieを設定する

オンラインでこの状況に固有の何かを見つけることができなかったので、ここに行きます...「second.com」を参照しているときに「first.com」に保存されているCookieを設定/取得する必要があります。「first .com」ですが、「second.com」でのみJavaScriptにアクセスできます(必要に応じてDOMを操作できます)。

私の最初のアプローチは、「first.com/doAjax?setCookie=xxx」のようなページをロードし、「first.com/setCookie?cookieData=xxx」と言うajax呼び出しを行ったijsを使って、second.comにiframeを作成することでした。 "これにより、" first.com "に、渡されたデータでCookieが設定されます。

これは、second.comからfirst.comにCookieを設定するのにかなりうまくいきました。Cookieを取得するために、基本的に同じ手順に従って、「first.com/doAjax?getCookie」をロードするiframeを作成しました。これにより、ajax呼び出しが行われます。 「first.com/getCookie」と言うと、first.comのCookie情報が読み取られ、JSONオブジェクトとして返されます。

問題は、JSON Cookieオブジェクトを「second.com」に戻すことができないため、読み取ることができることです。「window.top」を使用してAjax呼び出しが完了したときに、タイミングの問題が発生する可能性があります。これは、iframeが読み込まれたときとは相対的ではないためです。私は明確で、このクレイジーなiframe-> ajaxのクラップよりも簡単な解決策があるかどうか疑問に思っていました。これは、SAFARIでCookieを取得するためにも機能しないようです。

22
Luca Matteis

スクリプト要素をドキュメントのHEADに挿入することができます。コールバックを使用して、必要なCookieを必要な関数に渡します。

何かのようなもの:

 <script type="text/javascript">
   var newfile=document.createElement('script');
   newfile.setAttribute("type","text/javascript");
   newfile.setAttribute("src", 'http://first.com/doAjax?getCookie&callback=passCookie');
   document.getElementsByTagName("head")[0].appendChild(newfile);
 </script>

そして、ページfirst.com/doAjax?getCookieはこれを行うことができます:

     passCookie({'name':'mycookie', 'value':'myvalue'});
9
Ryan Doherty

このPHPファイルをfirst.comに配置します。

//readcookie.php    
echo $_COOKIE['cookiename'];

Second.comでは、このJavaScriptを使用して値を取得できます。

function readCookieCallback()
{
   if ((this.readyState == 4) && (this.status == 200))
   {
     alert("the value of the cookie is: "+this.responseText);
   } 
   else if ((this.readyState == 4) && (this.status != 200))
   {
     //error...
   }
}


function buttonClickOrAnything()
{
  var refreshObject = new XMLHttpRequest();
  if (!refreshObject)
  {
    //IE6 or older
    try
    {
      refreshObject = new ActiveXObject("Msxml2.XMLHTTP");
    }
    catch (e)
    {
      try
      {
        refreshObject = new ActiveXObject("Microsoft.XMLHTTP");
      }
      catch (e)
      {
        return;
      }
    }
  }
  refreshObject.onreadystatechange = readCookieCallback;
  refreshObject.open("GET", "http://www.first.com/readcookie.php");
  refreshObject.send();
}

よろしく、ロバート

0
Robert Wismet