この特集のトップページへ
>
Chapter 8:プレゼンテーション層の構築
●Sessionオブジェクトによるユーザーの管理
ASPのセッション機能は,Sessionオブジェクトによって提供される。ASPのセッション機能はクッキーを利用したもので,Fig.8-48のように動作する。
Fig.8-48 セッション機能の仕組み

クライアントがはじめて仮想ディレクトリにアクセスすると,IISは「セッションID」と呼ばれるランダムな文字列を作成し,それをクライアント側にクッキーとして送信する。このクッキーは,Webブラウザが閉ざされるまでを有効期間としたものである(有効期間の設定はない)。
それと同時に,そのセッションIDに結び付けられた記憶領域をサーバー側に作成する。このとき作成された記録領域が,Sessionオブジェクトである。
SessionオブジェクトにはContentsコレクションが実装されており,任意の値に任意の名前を付けて保存することができる。Sessionオブジェクトに値を保存するには,次の書式を使う。
<% Session.Contents("識別子") = 値 %>
識別子は,値を識別する任意の名前である。たとえば,次のようにすると,“USERNAME”という名前で値“F.Osawa”を保存することができる。
<% Session.Contents("USERNAME") = _
"F.Osawa "%>
Sessionオブジェクトに保存できる値は,Variant型で表現できれば何でもよく,数値や文字列など,どのような値でもかまわない。必要があれば,COMオブジェクトを保存することもできる。
なお,Contentsコレクションは省略して,次のように記述することもできる。
<% Session("USERNAME") = "F.Osawa %>
どちらの表記を使ってもよいが,以下の説明では,冗長になるのを避けるため,Contentsコレクションを省略する表記で説明してゆく。
ただし,Contentsコレクションを省略しないほうが,速度的にはやや有利である。というのは,コレクション名を省略したときにはデフォルトインタフェースが1回だけ多く取得されるからである(その詳細は,COMコンポーネントの深部に立ち入るものであり,複雑であるため,本稿での説明は省く)。
ContentsコレクションをFor Each 〜 Next構文を使ってループ処理すれば,Sessoinオブジェクトに保存した情報の一覧を得ることができる。たとえば,次のようにすると,Sessoinオブジェクトに保存した情報の一覧を出力できる。
<%
For Each fldname In Session.Contents
Response.Write Session(fldname)
Next
%>
また,ContentsコレクションのRemoveメソッドを使えば,保存した値を削除することもできる。たとえば,USERNAMEという名前で保存した値を削除するには,次のようにする。
<% Session.Contents.Remove("USERNAME") %>
さらに,ContentsコレクションのRemoveAllメソッドを使えば,保存したすべての値を削除することもできる。
<% Session.Contents.RemoveAll %>
さて,ここでクライアントが同じ仮想ディレクトリ内にある別のWebページ(ASPファイル)にアクセスしたとする(同じWebページのリロードでも一向にかまわない)。つまり,仮想ディレクトリに対して2回目以降のアクセスをしたとする。このとき,すでにWebブラウザはセッションIDをクッキーとして保持しているから,そのセッションIDが(Cookieヘッダによって)IIS側に送信される。IISは,送信されてきたセッションIDを見て,すでに有効なセッションIDであると判断すると,新しくSessionオブジェクトを作らず,1回目のアクセスのときに作成した記録領域をSessionオブジェクトとする。
Sessionオブジェクトは同じ仮想ディレクトリ内にあるASPファイル間でのみ共有される。互いに別の仮想ディレクトリ内にあるASPファイル同士では,それぞれ別のSessionオブジェクトが使われる。
このような動作により,Sessionオブジェクトに保存された値は,同じ仮想ディレクトリ内にあるASPファイルから共有して利用することができる。つまり,Sessionオブジェクトに何らかの値を保存しておくと,その値を別のASPファイルに伝えることができるようになるのである。
セッションIDには,クライアントが接続してくるたびにランダムな文字列が用いられるため,クライアントごとに違った値となる。SessionオブジェクトはセッションIDに結び付けられた記録領域であるから,つまりのところSessionオブジェクトはクライアントごとに別の領域が割り当てられるということになる。いい換えればSessionオブジェクトとは,クライアントごとに用意された一時的な記録領域であるといえる。
| 23/43 |
