この特集のトップページへ
>
Chapter 8:プレゼンテーション層の構築
○セッションIDの有効期間と無効化
IISは,初めて仮想ディレクトリにアクセスしてきたときに,セッションIDをクッキーとして発行する。ただし,すでに述べたとおり,その有効期間はWebブラウザが閉ざされるまでである。
では,Sessionオブジェクトも,ユーザーがWebブラウザを閉じるまで有効かというと,そういうわけではない。なぜならば,Sessionオブジェクトに保存されるデータはサーバー側で保持されるものだからである。もしユーザーがWebブラウザをずっと開いたままにしておいたときに,サーバー側に保存されているデータが破棄されずにずっと残るのだとすれば,このようなユーザーの増大に伴って,サーバーはリソース不足に陥るおそれがある。
そこでIISでは,Sessionオブジェクトにタイムアウトという概念を設けている。Sessionオブジェクトを作成したとき(セッションIDを割り当てたとき,いい換えれば初回にクライアントがアクセスしたとき)から一定時間が経過したら,IISはそのSessionオブジェクトを破棄する。Sessionオブジェクトを破棄しても,クライアントはセッションIDを保持したままになっているわけだが,クライアントが次に接続してきたときには,提示したセッションIDと対応するSessionオブジェクトが存在しない。そのためIISは,新しいSessionオブジェクトを作り直すことになる。これにより,一定時間が経過すると,クライアントに結び付けられたSessionオブジェクトは初期化された状態となる。
Sessionオブジェクトのタイムアウト時間を設定するには,まず,サイトのプロパティの[ホームディレクトリ]ページ(Fig.8-11)または仮想ディレクトリのプロパティの[仮想ディレクトリ]ページを開く。そして[構成]ボタンを押すと表示されるアプリケーションの構成ダイアログボックスで[アプリケーションのオプション]ページ(Fig.8-15)を開き,[セッションのタイムアウト]にて設定すればよい。[セッションタイムアウト]には,Sessionオブジェクトの有効期間を分単位で設定する。デフォルトは20分である。
それ以外に,スクリプトからSessionオブジェクトのTimeoutプロパティを操作することにより,一時的にタイムアウト時間を変更することもできる。たとえば,スクリプトからタイムアウト時間を5分に設定するには,次のようにすればよい。
<% Session.Timeout = 5 %>
ところで,Webアプリケーションでは,強制的にSessionオブジェクトを破棄したいこともある。たとえば,ユーザーを識別するWebアプリケーションで,Sessionオブジェクトにユーザー情報を保存するようにしている場合,ページのどこかに[ログアウト]などのボタンを用意し,もう一度ログイン画面から操作をやり直しさせたいようなことがある。その場合,[ログアウト]ボタンが押されたら,Sessionオブジェクトを破棄して,そのオブジェクトに保存されているユーザー情報を破棄する必要があるだろう。
Sessionオブジェクトに保存されている情報を破棄するには,すでに説明したSession.Contents.RemoveAllメソッドを使うという方法もあるが,代わりにSession.Abandonメソッドを使うと,Sessionオブジェクトそのものが破棄される。
<% Session.Abandon %>
ただし,Session.Abandonメソッドを呼び出しても,そのASPファイルの実行が終わるまではSessionオブジェクトを利用することができる。というのは,Sessionオブジェクトが破棄されるタイミングとは,ASPファイルの実行が終了したときであるからである。
IISは,デフォルトでセッション機能が有効になっている。つまり,仮想ディレクトリに対するアクセスがあると,自動的にセッションIDを作成してクライアントに送信し,そのセッションIDに対応したSessionオブジェクトを生成する。しかし,Sessionオブジェクトを使わないWebアプリケーションであれば,この機構を動作させるのは無駄である。たとえば,静的なHTMLファイルしか格納しない仮想ディレクトリに対するアクセスにセッションIDを割り当て,Sessionオブジェクトを作成するのは,明らかに無駄であろう。
そこでIISでは,アプリケーションの構成ダイアログボックスの[アプリケーションのオプション]ページ(Fig.8-15)にある[セッションの状態を有効にする]のチェックボックスを解除することで,セッション機能を無効にすることができる。セッション機能を無効にすれば,セッションIDを割り当てたり,Sessionオブジェクトを作成したりする処理を実行しないようになる。もしSessionオブジェクトを使わないのであれば,[セッションの状態を有効にする]のチェックボックスを解除することで,セッション機能のオーバーヘッドがなくなる分だけ,パフォーマンスが若干向上する。
セッション機能を無効にする方法は,もう1つある。ASPファイルの冒頭に“<% @ENABLESESSIONSTATE = False %>”と記述する。
○Sessionオブジェクトを利用する際の注意
いままで説明してきたように,Sessionオブジェクトを使うと,同じ仮想ディレクトリ内にあるWebページ間でデータを容易に受け渡すことができるようになる。
しかし,Sessionオブジェクトは,セッションIDをクッキーで送信することによりクライアントを識別していることを忘れてはならない。クッキーをサポートしないWebブラウザや,ユーザーによってクッキーを無効に設定されたWebブラウザを利用する場合には,Sessionオブジェクトは期待されるようには機能しない。
クッキーをサポートしない,あるいはクッキーを無効に設定されたWebブラウザであっても,Sessionオブジェクトを利用することはできる(実行時エラーにはならない)。しかし,クッキーをサポートしないWebブラウザは,IISから送信されたセッションIDを無視するので,2回目以降の接続でもCookieヘッダでセッションIDを提示しない。そのため,サーバー側で以前にSet-Cookiesヘッダで送信したセッションIDを識別することができず,再び新しいセッションIDを割り当て,さらに新しいSessionオブジェクトを作成してしまう。つまり,接続のたびに新しいSessionオブジェクトが使われることになり,前回の接続でSessionオブジェクトに保存したデータは,失われてしまうということになる。
| 25/43 |
