.ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録

.検索

.メインメニュー

.フォーラムメニュー

.オンライン状況
15 人のユーザが現在オンラインです。 (13 人のユーザが フォーラム を参照しています。)

登録ユーザ: 0
ゲスト: 15

もっと...

.
.リンク集

メイン
   一般的な話題(General)
     持続的接続ハートビートをAjaxで実現
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
aokazu
投稿日時: 2008-10-6 15:05
Baker 常連
登録日: 2007-1-8
居住地: 浦安
投稿: 57
持続的接続ハートビートをAjaxで実現
aokazuです。
お世話になっております。

セッションが切れてデータ登録が出来ないというクレームに対応するために
ハートビートという技法があるのを知りました。

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

上記ではフレームを利用してハートビートしているのですが、
これならAjaxで実装できると思い、下記のようなプログラムを行いました。

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


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


<?php
echo $ajax->div("heartBeat",array("style"=>"display:inline"));
echo 
$ajax->divEnd("heartBeat");

//セッションが切れる10秒前に呼び出す。
$gc_maxlifetime ini_get("session.gc_maxlifetime");
$frequency $gc_maxlifetime-10;

$options =array(
    
"url"=>"/contents/heart_beat/",
    
"update"=>"heartBeat",
    
"frequency"=>$frequency
);
echo 
$ajax->remoteTimer($options);
?>



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

.......
<?php
echo $javascript->link("prototype.js")."\n";
echo 
$this->renderElement("heart_beat");
?>
</body> </html>

※prototype.js が必要です。

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


<?php
...
//ヘルパーにAjaxを指定
var $helpers =array("html","javascript","ajax");

...
    
アクションを設定
    
function heart_beat(){
        
$this->layout=null;
        
//セッションID更新、古いセッション削除
        
$this->Session->renew(); 
    }
...
?>



上記アクションに対するビューを設定

/views/contents/heart_beat.thtml

ファイルの中は空のままでOK。

何か問題点があればご指摘頂けるとありがたいです。<(_ _)>

aokazu mode-A

aokazu
投稿日時: 2008-10-7 21:30
Baker 常連
登録日: 2007-1-8
居住地: 浦安
投稿: 57
Re: 持続的接続ハートビートをAjaxで実現
自己レスです。

セッションが切れる時間は、php.ini ではなく
CAKE_SECURITYによって決定されるようなので
セキュリティーレベルごとに設定するようにエレメントを変更しました。


/views/elements/heart_beat.thtml


<?php
echo $ajax->div("heartBeat",array("style"=>"display:inline"));
echo 
$ajax->divEnd("heartBeat");

//セッションが切れる1秒前に呼び出す。
switch (CAKE_SECURITY) {
    case 
"high":
        
$frequency=9;
        break;
    case 
"medium":
        
$frequency=99;
        break;
    case 
"low":
        
$frequency=299;
        break;
}

$options =array(
    
"url"=>"/contents/heart_beat/",
    
"update"=>"heartBeat",
    
"frequency"=>$frequency
);
echo 
$ajax->remoteTimer($options);
?>



aokazu mode-A

aokazu
投稿日時: 2008-10-17 8:11
Baker 常連
登録日: 2007-1-8
居住地: 浦安
投稿: 57
Re: 持続的接続ハートビートをAjaxで実現
自己レスその2です。

セッションタイムアウトの時間は、
CAKE_SESSION_TIMEOUT と掛け合わせて決定するのですね。
エレメントの再変更を行いました。

/views/elements/heart_beat.thtml


<?php
echo $ajax->div("heartBeat",array("style"=>"display:inline"));
echo 
$ajax->divEnd("heartBeat");

//セッションが切れる1秒前に呼び出す。
switch (CAKE_SECURITY) {
    case 
"high":
        
$frequency = ( CAKE_SESSION_TIMEOUT 10 ) - 1;
        break;
    case 
"medium":
        
$frequency = ( CAKE_SESSION_TIMEOUT 100 ) - 1;
        break;
    case 
"low":
        
$frequency = ( CAKE_SESSION_TIMEOUT 300 ) - 1;
        break;
}

$options =array(
    
"url"=>"/contents/heart_beat/",
    
"update"=>"heartBeat",
    
"frequency"=>$frequency
);
echo 
$ajax->remoteTimer($options);
?>



※ハートビート更新の直前に、画面更新を行うと
戻ってきた時にセッションが入れ替わっていてエラーになるようなのですが、
何か対策する方法は考えられますでしょうか?

CAKE_SECURITY=='high' で 20分なので確立的には低いのですが、、、。

aokazu
投稿日時: 2008-10-29 14:42
Baker 常連
登録日: 2007-1-8
居住地: 浦安
投稿: 57
Re: 持続的接続ハートビートをAjaxで実現
aokazuです、お世話になっております。

どうやら javascript のタイマーはPCに依存するので、
サーバーとの誤差が発生してしまうようです。
1秒だと誤差を飲み込めないケースが結構発生していました。

15秒ほど早めに設定をするようにしました。


<?php
echo $ajax->div("heartBeat",array("style"=>"display:inline"));
echo 
$ajax->divEnd("heartBeat");

//セッションが切れる15秒前に呼び出す。
$limit =15;
switch (
CAKE_SECURITY) {
    case 
"high":
        
$frequency = ( CAKE_SESSION_TIMEOUT 10 ) - $limit;
        break;
    case 
"medium":
        
$frequency = ( CAKE_SESSION_TIMEOUT 100 ) - $limit;
        break;
    case 
"low":
        
$frequency = ( CAKE_SESSION_TIMEOUT 300 ) - $limit;
        break;
}

$options =array(
    
"url"=>"/contents/heart_beat/",
    
"update"=>"heartBeat",
    
"frequency"=>$frequency
);
echo 
$ajax->remoteTimer($options);
?>



mode-A
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 


. .