Access-Control-Allow-Origin試してみた。その2

前回めでたくクロスドメインからレスポンスもらえるようになったけど、Cookieが送れなかった件。
参考をよーく見直してみたら、なんかCookieセットできそうな文章を発見。で、再度お試し。


RPC側を次のように修正。Access-Control-Allow-Credentialsヘッダーを追加する。

<?php
header('Access-Control-Allow-Origin:http://localhost');
header('Access-Control-Allow-Credentials:true');
header('Content-Type:text/plain;charset=UTF-8');
$msg = ' World';
if(isset($_COOKIE['_test_'])) {
    $msg = ' Again';
} else {
    setcookie('_test_', 'on', time()+864000);
}
echo 'Hello' . $msg;

で、接続用のJavascriptを次のように修正。withCredentialsプロパティにtrueをセットする。

window.onload = function() {
    var xhr = new XMLHttpRequest();
    xhr.open('GET', 'http://test.dev/rpc.php', true);
    xhr.withCredentials = true;
    xhr.onreadystatechange = function() {
        if(xhr.readyState === 4) {
            var res = xhr.responseText;
            alert(res);
        }
    };
    xhr.send(null);
};

で、再度アクセス。1回目のアラートはHello World、2回目はHello Againがアラートで表示された!


クロスドメイン間でCookieもやりとりするには今回のヘッダーとプロパティが必要っぽい。
ちなみにAccess-Control-Allow-Originヘッダーを*指定にして全許可にしたら、うまくいかなかった。
ちゃんと許可するドメインは絞りなさいよ。ってことなのかな。


確認したブラウザは次のとおり。

ブラウザ 結果
Firefox 3.6.8
Firefox 3.5.11
Google Chrome 5.0.375.127
Chromium 6.0.454.0
Safari 5.0.1
Opera 10.61 ×

Safariはデフォルト設定だとサードパーティCookieけっちゃうから、ブラウザの設定変えるか、
RPCのドメインの方に直接アクセスしておいて、一回Cookieもらっておけば送れるっぽい。
Operaは実装待ちかな。