CakePHP でハートビート

投稿者 aoki 2008 年 11 月 9 日 – 12:03 PM -

「登録フォームで、せっかく入力したデータが消えてしまった。」 という状況(セッション切れ)に問題を抱えたことはありませんか?

これに対して、IPAのサイトで安全にセッションを延長する方法で「ハートビート」という技法があるのを知りました。

http://www.ipa.go.jp/security/awareness/vendor/programming/a05_03_main.html

上記ではフレームを利用してハートビートしているのですが、

これならAjaxで実装できると思い、下記のようなプログラムを行いました。

セッションが切れる15秒前にハートビートをAjaxで呼び出します。

ますは、エレメントを作成
/views/elements/h_beat.thtml

PHP:
  1. <?php
  2. echo $ajax->div("heartBeat",array("style"=>"display:inline"));
  3. echo $ajax->divEnd("heartBeat");
  4.  
  5. //セッションが切れる15秒前に呼び出す。
  6. $limit =15;
  7. switch (Configure::read('Security.level')) {
  8.     case "high":
  9.         $frequency = ( Configure::read('Session.timeout') * 10 ) - $limit;
  10.         break;
  11.     case "medium":
  12.         $frequency = ( Configure::read('Session.timeout') * 100 ) - $limit;
  13.         break;
  14.     case "low":
  15.         $frequency = ( Configure::read('Session.timeout') * 300 ) - $limit;
  16.         break;
  17. }
  18.  
  19. $options =array(
  20.     "url"=>"/contents/heart_beat/",
  21.     "update"=>"heartBeat",
  22.     "frequency"=>$frequency
  23. );
  24. echo $ajax->remoteTimer($options);
  25. ?>

エレメントをレイアウトから呼び出します。
/views/layout/default.thtml

PHP:
  1. ..........
  2.  
  3. echo $javascript-&gt;link("prototype.js")."\n";
  4. echo $this-&gt;renderElement("h_beat");
  5. ?&gt;

※prototype.js が必要です。

Ajax呼び出し先 URLのコントローラを設定します。
今回は(/contents/heartBeat/)とします。
/controllers/contents_controller.php

PHP:
  1. ...
  2. //ヘルパーにAjaxを指定
  3. var $helpers =array("html","javascript","ajax");
  4. ...
  5. アクションを設定
  6. function heartBeat(){
  7. $this-&gt;layout=null;
  8. //セッションID更新、古いセッション削除
  9. $this-&gt;Session-&gt;renew();
  10. }
  11. ...

上記アクションに対するビューを設定
/views/contents/heart_beat.thtml
ファイルの中は空のままでOK。


Tags: ,
カテゴリー: PHP | トラックバックURL

コメントをどうぞ