Session クラス
セッションクラスを使用することでステートレスな Web 環境において、アプリケーションの状態を管理出来るようになります。
サーバー上の様々なストレージに変数を格納し、それらを次のページリクエストに再度呼び出すことが出来ます。
手動読み込み
ほとんどの場合、使用法ページの記載で十分目的のドライバを設定し、メソッドを利用することができます。
しかしながら、セッションが振る舞う方法をより詳細に制御したい状況があるでしょう。
セッション設定ファイルで設定されている別のセッションドライバを利用する場合があります。
もしくは、同時に複数のドライバを必要としています。 それは forge メソッドの出番です。
forge メソッドは設定ファイルまたはパラメータで定義されたドライバを利用し、セッションクラスのインスタンスを返します。
動的呼び出しを利用し、使用法ページの記載されたメソッドで返されたオブジェクトで利用することができます。
forge($config = array())
forge メソッドは、セッションドライバを手動でインスタンス化することができます。
静的 |
はい |
パラメータ |
パラメータ |
デフォルト |
説明 |
$config |
任意 |
forge メソッドに単にドライバの名前を渡すことで希望のドライバを選択することができます。
より多くのカスタム設定が必要な場合は、設定ページに記載されたパラメータを利用し、 $config 配列を定義します。
ここに渡す設定は設定ファイルで定義された内容を上書きします。
|
|
返り値 |
オブジェクト - セッションオブジェクトのインスタンス |
例 |
// データベースセッションをインスタンス化
$session = Session::forge('db');
// セッションからカウンターを取得
$counter = $session->get('counter');
// 存在しない場合、デフォルトを設定
if ($counter === false)
{
$counter = 0;
}
// カウンターを書き込む
$session->set('counter', $counter);
// Fuel はその処理をするので、明示的に記述する必要はありません...
// また、設定ファイル内のデフォルト値を上書きする設定でドライバをロードすることが可能
$session = Session::forge( array('driver' => 'memcached', 'expiration_time' => 3600, 'memcached' = array('cookie_name' => 'appcookie')) );
|
ご注意: あなたは、同時に複数のセッションドライバを利用する場合、これらのドライバの各インスタンスの cookie_name は一意である必要があります。
既に利用している cookie_name を利用しドライバを読み込もうとして、それを利用してインスタンスをロードしようとしているのと同じドライバを利用している場合、そのインスタンスが再利用されます。
インスタンスが別のドライバを使用している場合、例外がスローされます。
rotate()
rotate メソッドは手動でのセッション id のローテーションをユーザが強制することができます。 例えば、現在のユーザーのセキュリティレベルが変更されたとき、などに追加のセキュリティ対策としてこれを使用することができます。
静的 |
いいえ |
パラメータ |
なし
|
返り値 |
なし |
例 |
// データベースセッションをインスタンス化
$session = Session::forge('db');
// 強制的にセッション id のローテーション
$session->rotate();
|
get_config()
get_config メソッドはセッションドライバ設定項目を取得することができます。
静的 |
いいえ |
パラメータ |
パラメータ |
デフォルト |
説明 |
$name |
必須 |
セッション設定の変数の名前。
|
|
返り値 |
mixed 、要求された値、または、要求された変数が存在しないことを示す null |
例 |
// データベースセッションをインスタンス化
$session = Session::forge('db');
// 定義されたセッションクッキー名を取得
$cookiename = $session->get_config('cookie_name');
|
set_config()
set_config メソッドは実行時にセッションドライバの設定項目を変更することができます。
静的 |
いいえ |
パラメータ |
パラメータ |
デフォルト |
説明 |
$name |
必須 |
セッション設定の変数の名前。
|
|
返り値 |
なし |
例 |
// データベースセッションをインスタンス化
$session = Session::forge('db');
// このセッションの有効期限を 2 時間後に設定
$session->set_config('expiration_time', 7200);
|
Flash とセッションの使い方
ウェブサイトで Flash オブジェクトを利用する問題点の 1 つは、彼らがあなたのウェブアプリケーションと対話するとき、ブラウザに保存されているクッキーを送信しないことです。
この問題が原因で、アプリケーションのセッション状態を認識させることは困難となります。
この問題を解決するために、セッションクラスは、 POST 変数を利用しアプリケーションにクッキーを渡すことができます。
'post_cookie_name' 設定を利用し変数の名前を設定することができます。 Session クラスは、 $_POST
変数にこの名前を見つけた場合、それにセッションクッキーが含まれていると仮定し、セッションクッキーを使用しません。
これは少しの JavaScript を利用してセッションクッキーのクライアントサイドの内容を POST 変数にコピーすることができます。
Flash ベースのアップローダ利用時。 match_ua 設定を false に設定する必要があります。
Flash が異なるユーザーエージェントを使用しているためこれを行う必要があり、これはユーザセッションを正しく識別するために
Session クラスの (訳注:動きを) 防ぐことができます。
// セッションクッキーを取得する関数
// あなたが利用したり、所有している、または用意した好きな javascript のフレームワークを利用できます。
function getCookie(c_name)
{
if (document.cookie.length > 0)
{
c_start = document.cookie.indexOf(c_name + "=");
if (c_start != -1)
{
c_start = c_start + c_name.length + 1;
c_end = document.cookie.indexOf(";", c_start);
if (c_end == -1) c_end = document.cookie.length;
return unescape(document.cookie.substring(c_start, c_end));
}
}
return "";
}
// この例では jquery と uploadify を使用しており、 'fuelcid' として formData で
// Fuel のクッキー (ここでは 'fuelcid' と呼ぶ) を渡している。
// 注意:このコードを生成するとき、クッキー名をハードコードせず、その代わりに、
// セッション設定ファイルからクッキー名を取得してください。
// 注意:: あなたが戻ってセッションIDを渡すために利用可能なクッキーを持っていない場合は
// 下記のセクション "クッキーなしのセッション" をチェックしてください。
// ( パラメータは Uploadify Version 3.2 に関連している )
$(function()
{
$('#custom_file_upload').uploadify(
{
'swf' : '/uploadify/uploadify.swf',
'uploader' : '/uploadify/uploadify.php',
'multi' : true,
'auto' : true,
'fileTypeExts' : '*.jpg;*.gif;*.png',
'fileTypeDesc' : 'Image Files (.JPG, .GIF, .PNG)',
'queueID' : 'custom-queue',
'queueSizeLimit' : 3,
'removeCompleted': false,
'formData' : {'fuelcid': getCookie('fuelcid')},
'onSelect' : function(file)
{
alert('ファイル ' + file.name + ' はキューに追加されました。');
},
'onQueueComplete' : function(queueData)
{
alert(queueData.uploadsSuccessful + ' ファイルが正常にアップロードされました。');
}
});
}
並行性
セッション、セッションクッキー、およびそれらの挙動について話したとき、それは彼らはどのように動作するか
そして可能性と制限があることを理解することが重要です。
これは同時に実行される場合に特にあてはまります。
ウェブベースのアプリケーションでは、ウェブページ上で複数の非同期 ajax 呼び出しを利用している場合、または同じアプリケーションの複数のウィンドウを開くこと
(これは、受け入れましょう、あなたが防ぐことができないものです) をブラウザが許可した場合に、並行性を持つことになります。
あなたが知っている必要がある何か別のこととしてはそれがデフォルトで、セッションクラスは定期的にセッション id をローテート(または再生成)し、セッション id
が固定されていることが原因でのセッションハイジャック (誰かあなたのセッションクッキーを盗みセッションを引き継ぐためにそれを使用) を防止します。
設定を使用しローテーション時間を制御するか、あるいは、それを無効にできますが、しかし、セキュリティの観点からすると悪い考えです。
これら 2 つを一緒に行うことは、あなたの手で起こりうる災害を持つということです!
実例:
- ページをリクエストすると、 ID-A を含むセッションクッキーがサーバーに送信されます。
- ページは 2 つの ajax リクエストを送信します。 ID-A を含むセッションクッキーは、再び各リクエストでサーバーに送信されます。
- ajax リクエスト 1 が完了し、 ID をローテートさせる。 ID-B のクッキーがブラウザに送信されます。
- 今 ajax リクエスト 2 が完了。 それは同じクッキーを送ったため、それはまたローテートさせ、 この時間には ID-C 。
(セッション ID は、ランダム化アルゴリズムを使用して生成されるため、別の ID を取得します)
今や問題を抱えている。 セッションクラスは ID-C にキー ID-A と保存されたセッションを更新しようとしますが、セッションクラスは保存されたセッションを更新するとともにキーを ID-A から ID-C へと変更しようとしますが、そのセッションを見つけることができません。
思い出してください、それは最初の ajax 呼び出しによって ID-A から ID-B へと更新されていました! そのためセッションが無効であると判断し、新しい空のセッションを作成し、
そしてブラウザにそのクッキーを返します。 今や有効なクッキーは新しい空のセッションクッキーによって上書きされます。
結果:あなたはセッションを失いました。
これはほとんどのフレームワークが解決していない問題です。 Fuel に参加してください!
Fuel のセッションクラスはこの問題を検出し軽減するための 2 つのメカニズムを含んでいます。
すべてのセッションキーストアは 2 つのセッション ID を含みます:現在の ID と、以前の ID 。
リクエストがセッション ID がローテートされた直後に来た場合は、正しいセッションはキーストアに格納され以前のセッション ID を利用して特定することができます。
そしてセッション ID が一致しない場合、それ以前の ID を利用して回復することができなかったか、更新されなかったクッキーはブラウザに送信されません。
結果はその要求のセッションデータが失われますが、セッション自体を失うことはありません。
クッキーなしのセッション
セッションデータの変更後、 Session クラスは常にセッションクッキーを生成し、そして HTTP レスポンスヘッダでそれをクライアントへ送信します。
しかしながら、それが望ましくない、クッキーを使用するのでさえ不可能な状況があります。
例えば、単にクライアントがそれらをサポートしていないため。
これらのケースでは、クライアントからのリクエストからアプリケーションへセッション ID を渡すための代替方法があります:
- GET 変数を経由。 URL 内の変数の名前は 設定で定義されているクッキーの名前と等しくなければなりません。
- POST 変数を経由。 設定で session-id を含むフォームのフィールド名 (post_cookie_name) を定義することができます。
- HTTP ヘッダ経由。 HTTP リクエストのクライアント側を構築する場合には、セッション ID とともに "Session-Id" HTTP ヘッダを追加することができます。
現在のセッション ID を取得するために Session::key()
を使用することができ、そのためクッキーの代わりに利用し、
クライアントへレスポンスで渡すことができます。 セッションの設定で暗号化を設定している場合、 id を暗号化する必要があります:
// セッション ID を取得し暗号化
$session_id = \Crypt::encode(\Session::key());