CakePHP1.2でケータイ向けセッション管理

ケータイではCookieを使えないので、通常のセッション管理ができない。URLにセッションIDを埋め込むなどの対策が必要になる。1.2での設定方法をまとめてみる。

/m/以下をケータイ用に振り分けことを前提に。

app/config/core.php

//Configure::write('Session.save', 'php');
Configure::write('Session.save', 'usersession'); //こちらに修正

セッションを扱う箇所を独自コードに置き換えることができる。コードは、app/config/usersession.phpに記述する。

app/config/usersession.php

新規で作成。

<?php
if (!isset($_SESSION)) {
	if (function_exists('ini_set')) {
		if(defined('MOBILE')){ //ケータイ用だったら
			ini_set('session.use_trans_sid', 1); //GETリクエストにセッションIDを自動的に埋め込む設定を有効
			ini_set('session.use_cookies', 0);   //Cookieの使用を無効
		}else{
			ini_set('session.use_trans_sid', 0);  //無効
			ini_set('session.use_cookies', 1);    //有効
		}
	}
}
?>

MOBILEという変数は、別クラスで設定する

app_controller.php

<?php
class AppController extends Controller {
	var $needAuth = false;
	var $helpers = array('html', 'form', 'time');

	function beforeFilter()
	{
	//ケータイ用の振り分け
	if(isset($this->params['prefix'])){
		$this->layout = 'mobile_'.$this->layout;
	}
	$auth = $this->Session->read( 'auth' );
	$this->set( "auth", $auth );

	if( $this->needAuth ){
		if( empty( $auth ) ){
			if(defined('MOBILE')){ //ケータイへの振り分けがされていたら、ケータイ向けのログイン画面へ
				$this->redirect( "/m/users/login" );
			}else{
				$this->redirect( "/users/login" );
			}
			return ;
		}
	}
	if(defined('MOBILE')){ //ケータイ用にSJISに文字コード変換
		mb_convert_variables('UTF-8','SJIS-win',$this->data);
	}

	ob_start(); //文字コード変換用の処理開始
	parent::beforeFilter();
}

function __construct()
{
// /m/がURLの中にあった場合、MOBILE変数を設定。このフラグを各クラスで判別
	if(ereg("^/m/",$_SERVER['REQUEST_URI'])){ // もし、URLが/<em>servicename</em>/m/だったら、"^/<em>servicename</em>/m/"
		define('MOBILE',1);
	}

	parent::__construct();
}

function afterFilter()
{
	parent::afterFilter();
	$out = ob_get_clean();

	if(defined('MOBILE')){
		$out = mb_convert_encoding($out,'SJIS-win','UTF-8'); //ケータイからの入力をSJISからUTF-8に変換
	}

	echo $out;
}

//redirect メソッド書き換え
function redirect($url,$status = null)
{
	if(defined('MOBILE')){
		$url = $url."?".session_name()."=".session_id(); //転送先URLにセッションIDを自動付加
	}

		parent::redirect($url,$status);
	}
}
?>

POSTのフォーム

GETでは、自動的にセッションIDが埋め込まれるが、POSTではセッションIDの埋め込みを明示的に行う必要がある。<form>で以下のように記述する。

<form action="foo?<?php session_name()."=".session_id();?>" method="POST">

参考サイト:

CakePHP1.2でケータイ向けセッション管理」への2件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA