JavaScriptのサブドメインへのクッキーの設定

13063 ワード

サブドメインへのクッキーの設定は非常にトリッキーです.
最近FOOからクッキーを設定するという問題に直面しました.Mycompanyすべてのサブドメイン*.mycompany.com ドメイン.解決策はかなり簡単だった:ちょうどワイルドカードクッキーを設定する.mycompany.com (最初の文字はドットです).しかし、ターゲットドメイン(実際の値)を決定しなければなりませんでした.mycompany.com ”) 私のコードが何万もの異なるドメインで解雇されるので、自動的に.
そして、問題が来ました:リストTop-Level Domains .

トップレベルドメインとクッキー
次の2つのドメインを考えましょう.
  • FOOバー.コム
  • FOO株式会社
  • JavaScriptを使用すると、すべてのクッキーを利用できるように設定することができますbar.com 内部からのサブドメインfoo.bar.com サブドメイン.
    しかし、すべてのクッキーを設定することはできませんco.uk 内部からのサブドメインfoo.co.ok サブドメインco.uk はトップレベルドメインです.それが可能であるならば、あなたのブラウザーはそのクッキーを英国で利用できるすべてのウェブサイトに送りますco.uk ) ドメイン.
    Webブラウザは、与えられた文字列がトップレベルドメインかどうかチェックする方法を提供しません.そのような特徴が存在するならば、私がクッキーをセットすることができるかどうか決定するのを助けます.co.uk 私にはできません..bar.com (これはできます).

    リスト内のTLDSのリスト
    解決策の一つは、あなたのアプリケーション内のすべてのトップレベルドメインのリストを格納し、このリストに対してドメインをチェックすることです.Mozilla FoundationはプロジェクトをホストしますPublic Suffix List これは1つの場所にすべてのTLD名を格納します.
    しかし、実際には、リスト内のリストを維持するだけで痛みの痛みです.

    "try and check "メソッド(推奨)
    しかし、より簡単な解決策があります:単にクッキーをドメインにセットして、ブラウザーが実際にそのクッキーをセットするかどうかチェックしてください.そうでなければ、トップレベルドメインであり、サブドメインにクッキーを設定する必要があります.
    ここでは、クッキーとコードをTLDの問題に設定するコードの例を示します.それは、1からの有名なコード断片の修正ですarticle about cookies "quirksmode ":
    var Cookie =
    {
       set: function(name, value, days)
       {
          var domain, domainParts, date, expires, host;
    
          if (days)
          {
             date = new Date();
             date.setTime(date.getTime()+(days*24*60*60*1000));
             expires = "; expires="+date.toGMTString();
          }
          else
          {
             expires = "";
          }
    
          host = location.host;
          if (host.split('.').length === 1)
          {
             // no "." in a domain - it's localhost or something similar
             document.cookie = name+"="+value+expires+"; path=/";
          }
          else
          {
             // Remember the cookie on all subdomains.
              //
             // Start with trying to set cookie to the top domain.
             // (example: if user is on foo.com, try to set
             //  cookie to domain ".com")
             //
             // If the cookie will not be set, it means ".com"
             // is a top level domain and we need to
             // set the cookie to ".foo.com"
             domainParts = host.split('.');
             domainParts.shift();
             domain = '.'+domainParts.join('.');
    
             document.cookie = name+"="+value+expires+"; path=/; domain="+domain;
    
             // check if cookie was successfuly set to the given domain
             // (otherwise it was a Top-Level Domain)
             if (Cookie.get(name) == null || Cookie.get(name) != value)
             {
                // append "." to current domain
                domain = '.'+host;
                document.cookie = name+"="+value+expires+"; path=/; domain="+domain;
             }
          }
       },
    
       get: function(name)
       {
          var nameEQ = name + "=";
          var ca = document.cookie.split(';');
          for (var i=0; i < ca.length; i++)
          {
             var c = ca[i];
             while (c.charAt(0)==' ')
             {
                c = c.substring(1,c.length);
             }
    
             if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
          }
          return null;
       },
    
       erase: function(name)
       {
          Cookie.set(name, '', -1);
       }
    };
    
    以下に使用方法を示します.
    Cookie.set('test', '123');
    
    我々がいるときfoo.bar.com ドメインは、クッキーが利用可能になります*.bar.com サブドメイン.
    しかし、我々がいるときfoo.co.uk ドメインは、クッキーが利用可能になります*.foo.co.uk サブドメイン.
    このコードは、さまざまなドメインの何千もの私の生産環境でうまく動作します.それはトップレベルドメインのリストを格納し、リスト上のものに現在のドメインを比較するよりも簡単です.