シェアする

  • このエントリーをはてなブックマークに追加

[CakePHP+javascript]Cookieが有効かどうかを調べて、有効ならCakePHPからCookieを発行する

前回の記事とも少し関連するのですが、ユーザを特定するためのクッキー(自前のセッション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コメント欄でいただけると嬉しいです^^

  1. 試してないけど「[PHPメモ]Cookieが有効か否かチェックするプログラム | Webサイト運営ブログ」こちらを参考にさせていただく限りは画面変遷で判定できそう。 []

シェアする

  • このエントリーをはてなブックマークに追加

フォローする