3.3 セッションとglobal.asaファイルの利用
■アプリケーション
仮想ディレクトリおよび仮想ディレクトリの中のサブディレクトリ内のASPファイルの集合は一つの「アプリケーション」とみなされます。つまり、仮想ディレクトリは一つの業務処理たとえば、オンラインアンケートや電子掲示板(BBS)などのWebアプリケーションのためのルートディレクトリとみなされます。
クライアントがブラウザから、サーバ上の仮想ディレクトリ内(サブディレクトリも含め)のASPファイルに初めてアクセスすると、ASPはサーバ上でアプリケーションが開始されたことを認識しアプリケーションの起動イベントを発生します。ただし、その後アプリケーションに一定時間アクセスが発生しないと、アプリケーションは停止したと認識され、アプリケーションの停止イベントを発生します。
このようなアプリケーションの起動イベントや停止イベントは、仮想ディレクトリに直下に保存したglobal.asaという特殊なファイルでのみ検出可能です(図3.3)。
【注意】
global.asaファイルは省略可能ですが、もし配置するなら必ず仮想ディレクトリの直下に保存する必要があります。
図3.3
■セッション
クライアントがブラウザを起動し、サーバ上の仮想ディレクトリの下の(サブディレクトリも含め)ASPファイルにアクセスするとサーバ上でセッションが開始されたと認識され、セッション・イベントが発生します。別のクライアントが同じようにその仮想ディレクトリの下のASPファイルにアクセスすれば、別のセッションが開始されます。つまり、アプリケーションごと、クライアントごとにセッションが開始されます。
クライアントが同一アプリケーション内(同一仮想ディレクトリ内)の別のASPファイルに移動しても、セッションは継続されます。あるクライアントが一つのアプリケーションにアクセス中の期間をセッションと呼ぶとみていいでしょう。
実際には、アプリケーションを抜け出して、別のアプリケーションなり別のサイトのWepページに移動しても、すぐにはセッションは停止されず、既定値では20分は保持されます。つまり、その間に元のアプリケーションに戻れば前と同じセッションが継続されることになります。この既定のタイムアウトの値はサーバあるいはアプリケーションごとに変更可能です。
クライアントがアプリケーションにアクセスしセッションが開始された後、そのブラウザを閉じれば、セッションは停止されます。再度ブラウザを起動し同じアプリケーションにアクセスすれば今度は別のセッションが開始されます。
このようなセッションの起動イベントや停止イベントは、アプリケーションの場合と同様、仮想ディレクトリに直下に保存したglobal.asaという特殊なファイルでのみ検出可能です(図3.3)。
図3.4
■セッションごとのページカウント
アプリケーションへの来訪者数をカウントすることを考えます。ASPでは、セッションの概念を利用して、アプリケーションにおけるセッション数をカウントすることにします。つまり、アプリケーション内のあるページにアクセスしたら、その後同じアプリケーション内(同じ仮想ディレクトリ内)の別のページに移動しても、カウント値は増加させずにそのままとします。逆にあるブラウザでアプリケーションにアクセス後、一度ブラウザを停止し、再度同じブラウザを再起動してそのアプリケーションにアクセスした場合は、新たにカウント値を一つ増加させることとします(図3.4)。
セッション数のカウントにはPageCounterコンポーネントを利用します。ただ、PageCounterコンポーネントはページごとにアクセス数のカウントを行うので、アプリケーションのトップページ(index.asp)のアクセスカウンタ値をセッションへのアクセスカウンタ値とみなすこととします。
さらに、トップページのアクセスカウント値をセッションへのアクセスカウント値と同じにするために、トップページのアクセスカウントをセッション開始時に一度だけ行う必要があります。このためにglobal.asaファイルを使用します。つまり、ASPではセッション開始イベントは唯一global.asaファイル上のSession_OnStart関数で認識することができるからです。別の言い方をすれば、ブラウザからトップページ(index.asp)にアクセスし、それがセッションの最初のページである場合、トップページ(index.asp)の処理に入る前にまず仮想ディレクトリの直下にglobal.asaファイルがあるかどうかをチェックし、global.asaファイルがあれば、さらにglobal.asaファイル内にSession_OnStart関数が定義されているかどうかをチェックし、Session_OnStart関数があれば、まずSession_OnStart関数の処理を行います。
したがって、global.asaファイル内のSession_OnStart関数内でトップページのアクセスカウントを1増加させることとします。
■セッション開始イベント
global.asaファイル内でSession_OnStart関数の記述法はリスト3.2のようになります。
リスト3.2 global.asa
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
Sub Session_OnStart
'ここにセッション開始時の処理を記述します
Session("count") = objPage.Hits
End Sub
</SCRIPT>
gobal.asaファイルでスクリプトを記述する場合は、一般のASPファイルで使用するデリミタ"<%"と"%>"は使用する必要はありません。また、第1行目に
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
と記述します。
■セッションレベルの変数
ASPでは、同一セッション内で共有できる変数を定義できます。その書式は次のようになります。
Session("変数名") = 設定する値
また、セッションレベルの変数(Session変数)は同一セッション内で起動された任意のASPファイル内で参照することができます。その場合は、式の中で
Session("変数名")
と記述して参照することができます。
■アクセスカウンターの作成
global.asaファイル内にアクセスカウンタを設置するにはリスト3.3のように記述します。
リスト3.3では、どのページのページカウンタをカウントアップするかは、明示的に記述されていません。どのページのページカウンタをカウントアップするかは、セッション開始時に最初にアクセスしたページがどのページかによります。ここではトップページ(index.asp)を想定しています。
リスト3.3 global.asa
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
Sub Session_OnStart
'PageCounterオブジェクトを生成します
Set objPage = Server.CreateObject("IISSample.PageCounter")
'現在アクセス中のページカウンタの値を1だけカウントアップさせます
objPage.PageHit
'現在アクセス中のページカウンタの値をSession変数に保存します
Session("count") = objPage.Hits
End Sub
</SCRIPT>
■アクセスカウンターの表示
global.asaファイル内の処理が終わると、自動的にセッションで最初にアクセスしたページの処理に戻ります。
アクセスカウンターのカウンター値はSession変数に保存してあるので、たとえばトップページで表示することができます。例をリスト3.4に示します。
リスト3.4 index.asp
<%@ LANGUAGE="VBScript" %>
<% Option Explicit %>
<HTML>
<HEAD>
<TITLE>index.asp</TITLE>
</HEAD>
<BODY>
<B>Webアプリケーションのトップページ</B><BR>
<BR>
あなたは <%= Session("count") %> 人目の訪問者です<BR>
</BODY>
</HTML>
ブラウザを一度閉じ、再度ブラウザを起動してindex.aspファイルにアクセスしてみます。図3.3のようにトップページが表示されます。
図3.3
ここで、再読み込みボタンをクリックしても、カウンタ値が変わらないことが確認できます。
図3.4
同様に、同一サイトの他のページや他サイトのページに移動した後、再度トップページ(index.asp)にもどってもやはりカウンタ値が変わらないことも確認できます。
次に、ブラウザを一度閉じて、再度トップページ(index.asp)にアクセスすると、カウンタ値が1だけカウントアップされちるのがわかります。
図3.5
■