携帯対応 COOKIEを使わないSESSIONの使い方。

あまり、セッション周りには詳しくないのでめちゃ苦労した。
まず、私が認識している携帯事情では、
Docomo系携帯の一部(?)はCOOKIEが使えない。
AUは(COOKIEを)まず問題なく使える。
ソフトバンクはしらん。


つまるところ、携帯に完全対応させるには、
COOKIEを使わないSESSION管理が必要になる。


やり方の問題かもしれないが、
session.use_trans_sidを1にするやり方は
cakeではうまくいかなかった。


Google先生に問い合わせたところ
CakePHP に use_trans_sid 風の処理を組み込む
があったのでこれを参考にさせてもらった。
(というよりはこれでできる)


詳細は、リンク先に頼るとして、
タスクはこうだ。
app/app_controller.phpにMobileAppControllerクラスを書く。
app/config/bootstrup.phpにMY_SESSION_POST_NAME定数を定義する
app/config/core.phpのCAKE_SESSION_SAVE定数を書き換える
app/config/CAKE_SESSION_SAVE定数.phpを作成し、なかみを書く。
携帯対応したいcontrollerのextendsをMobileAppControllerに変更する。
携帯対応したいviewにhiddenを追加する。

と、ここまでがリンク先に載っている。
が、これだけでは不十分。
まず、
Controller::redirectを呼び出すとセッションの引継ぎが出来ない。
そして、実はこのままリンク先の設定を全てしてもうまくいかない場合がある。


さて、追って対応していこう。
まず、redirect問題は下記条件の場合は無視してよい。
redirectを使っていない。
controllerが変わるときに、情報を破棄してもOKな場合。


ただ、SNS的なサイトだとこれは現実的では無いので、
ちょっと変更を加える。
cake/libs/controller/controller.php
redirectメソッドを書き換える。
redirectメソッドの中に
header('Location:' . $url);
があるので、
header('Location: ' . $url . "?" . MY_SESSION_POST_NAME . "=" . session_id());
と書き換える。
これだと、PCサイト側の処理も同じようにリダイレクトがかかり、
URLが見た目汚くなってしまうので、携帯からのアクセスじか見分けた方が良いかもしれない
がこれでも動くのでひとまずOKとする。


そして最後。これで丸1日潰したので、注意してほしい。
実はこのままリンク先の設定を全てしてもうまくいかない場合がある。の所だ。

ここまできてテストをしてみても、うまくいかない場合はほぼ確実にこれ。
原因は、app/app_controller.phpのMobileAppControllerクラスの処理だ。
コンストラクタでpreg_matchをしているが、
/^[0-9a-f]{32}$/
ようは32文字の16進数表記とある。

が、私の環境では、
mやらsやらが入った、
/^[0-9a-z]{32}$/
の文字列がセッションIDとして採用されていた。(もしかしてopenSUSE10.2だから?)


まぁ、そんなこんなで、fの部分をzに変えるだけでうまくいくはずだ。
session_idをよく見れは分かることだったのに、目にもつかずで丸一日。
灯台元暗しとはこのことか!と思った。