前回の記事とも少し関連するのですが、ユーザを特定するためのクッキー(自前のセッションIDのようなもの。以下、自前IDとします)を、クローラー以外でまだクッキーを発行していないクライアントにCookieが有効な場合のみ発行したいときの対処方法です。
自前IDには、データベースに格納されたユーザ情報(AccessUser:環境変数とかセッション情報を持たせている)のIDをセットします。
Cookieが無効な場合はユーザIDを保持できないため、ユーザ情報の生成は行いません。Cookieが有効な場合のみユーザ情報を生成してそのIDをCookieに格納します。
PHPのみではCookie有効の判定ができない?
はじめは(Cake)PHPのみでCookieの判定を試みましたが、画面変遷を伴わない場合Cookieが無効の場合でも書込み⇒読込みが可能なように見えてしまいます。
// Cookieが有効かどうかを判定する関数(※動作しないので注意)
function checkCookie() {
$this->Cookie->write("check", "test"):
// 書き込んだクッキーをすぐに読み込んで、中身を取り出せたらtrue
$res = $this->Cookie->read("check");
if ($res === "test") {
return true;
}
return false;
}
こうすると、クッキーが有効・無効に関わらず$resが取得できてしまいtrueが返ってきます。
Cookieを書き込んだ後に、リダイレクトした先でクッキーをチェックすると判定できるようです*1 が、これでは先の要件を満たせません。
Cookie有効の判定はjavascriptで行う
そこで、Cookieの判定はjavascriptで行い、有効ならばajaxでCakePHPからクッキーを発行するようにしました。
javascriptであれば以下のようなコードで簡単に判定できます。
function cookieCheck() {
document.cookie = "y";
if (document.cookie == "") {
return false;
} else {
return true;
}
}
なので、CakePHP側にajaxからcookieを書き込むaction↓を作って
// ユーザ情報を生成してIDをCookieに保存する関数
function access_user_recording() {
if (!$this->RequestHandler->isAjax()) {
$this->redirect("/");
return;
}
$this->layout = "ajax";
Configure::write("debug", "0");
$save = $this->env; // 保存したいユーザ情報
if (!$this->AccessUser->save($save)) {
$this->log("AccessUserの生成に失敗");
$this->log($save);
return false;
}
$this->uid = $this->AccessUser->getInsertID();
return $this->Cookie->write("uid", $this->uid, true, COOKIE_TIMEOUT);
}
ビューで要件を満たす場合のみ上記のactionを呼び出します。ajaxにはjQueryを使いました。
views/layhout/default.ctp
-割愛-
<script type="text/javascript">
$(function(){
<?PHP if (!$is_crawler && empty($uid)) { // クローラ以外で自前IDを持っていない場合 ?>
$.get('<?PHP echo $html->url(array("controller" => "hoges", "action" => "access_user_recording")); ?>');
<?PHP } // End of if (!$is_crawler && empty($uid)) ?>
});
function cookieCheck() {
// 割愛
}
</script>
-割愛-
クローラ判定の$is_crawlerと自前ID($uid)は、CakePHPのbeforeFileterなどであらかじめsetしておき、ViewでPHPによって判定。条件に合う場合だけajaxのコードを出力します。
クッキーの発行処理をjavascriptにすべて委ねる方法もあると思いますし、もっと簡潔な方法もありそうな気はしますが「こんな実装もできました」という参考まで。(相変わらずわかりにくい記事でごめんなさい。僕のためのメモの意味合いが強いのでご容赦をσ(^_^; ))
お気づきのことがあればfacebookコメント欄でいただけると嬉しいです^^
- 試してないけど「[PHPメモ]Cookieが有効か否かチェックするプログラム | Webサイト運営ブログ」こちらを参考にさせていただく限りは画面変遷で判定できそう。 [↩]