前回の記事とも少し関連するのですが、ユーザを特定するためのクッキー(自前のセッション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サイト運営ブログ」こちらを参考にさせていただく限りは画面変遷で判定できそう。 [↩]