ASP 講義シリーズ (19) セッションの管理
著者:Eve Cole
更新時間:2009-05-30 19:58:38
Web アプリケーションの開発を成功させるための課題の 1 つは、ユーザーの訪問中またはセッション中にユーザーがアプリケーション内のページからページに移動するときにユーザー情報を維持することです。 HTTP はステートレス プロトコルです。つまり、Web サーバーはページへの各アクセスを無関係なアクセスとして扱い、現在のアクセスから数秒以内にアクセスが発生した場合でも、前のアクセスに関する情報を保持しません。前。以前の訪問の記憶が不足しているため、オンライン カタログなどのアプリケーションを作成することが困難になります。オンライン カタログでは、ユーザーがカタログの異なるページ間を移動中に選択したカタログ アイテムを追跡する必要がある場合があります。
ASP は、セッション情報の問題を管理するための独自のソリューションを提供します。 ASP セッション オブジェクトとサーバーによって生成された特別なユーザー ID を使用すると、各受信ユーザーを識別し、ユーザーの設定やコンテンツの選択を追跡するためにアプリケーションで使用される情報を収集できるインテリジェントなアプリケーションを作成できます。
ASP は HTTP Cookie を通じてユーザー ID を設定します。 HTTP Cookie は、ユーザーのブラウザに保存される小さなファイルです。したがって、Cookie をサポートしていないブラウザ用のアプリケーションを作成している場合、またはクライアントが Cookie を受け入れないようにブラウザを設定している場合は、ASP のセッション管理機能を使用しないでください。
アプリケーションの開始時または終了時に実行されるスクリプトを作成することもできます。
セッションの開始と終了 セッションは次の 3 つの方法で開始できます。
新しいユーザーは、Global.asa ファイルに Session_OnStart プロシージャが含まれているアプリケーション内の .asp ファイルを識別する URL へのアクセスを要求します。
ユーザーは、Session オブジェクトに値を保存します。
ユーザーがアプリケーションの .asp ファイルを要求すると、アプリケーションの Global.asa ファイルは <OBJECT> タグを使用して、セッション スコープを持つオブジェクトのインスタンスを作成します。
ユーザーが指定された期間、アプリケーション内のページを要求または更新しなかった場合、セッションは自動的に終了します。この期間のデフォルト値は 20 分です。アプリケーションのデフォルトのタイムアウト制限設定を変更するには、インターネット サービス マネージャーの [アプリケーション オプション] プロパティ ページで [セッション タイムアウト] プロパティを設定します。この値は、Web アプリケーションの要件とサーバーのメモリ領域に基づいて設定する必要があります。たとえば、Web アプリケーションを閲覧するユーザーが各ページに数分間だけ滞在できるようにしたい場合は、デフォルトのセッション タイムアウト値を短くする必要があります。セッション タイムアウト値が長すぎると、開いているセッションが多すぎるため、サーバーのメモリ リソースが使い果たされます。
特定のセッションに対して、デフォルトのタイムアウト値よりも小さいタイムアウト値を設定する場合は、Session オブジェクトの Timeout プロパティを設定できます。たとえば、次のスクリプトはタイムアウト値を 5 分に設定します。
<%セッション.タイムアウト = 5%>
Session.Timeout プロパティによってタイムアウト値を決定することもできます。
Session オブジェクトの Abandon メソッドを使用してセッションを明示的に終了することもできます。たとえば、テーブルに [終了] ボタンを提供するには、ボタンの ACTION パラメータを、次のコマンドを含む .asp ファイルの URL に設定します。
<% セッション.放棄 %>
SessionID と Cookie について
ユーザーが特定のアプリケーションで最初に .asp ファイルを要求すると、ASP は SessionID を生成します。 SessionID は、各ユーザー セッションを一意に識別する複雑なアルゴリズムによって生成される番号です。新しいセッションの開始時に、サーバーはセッション ID をユーザーの Web ブラウザに Cookie として保存します。
SessionID は、ユーザーがセッション中にアプリケーションを操作するときに、ASP がユーザー情報をサーバー上の「金庫」に保存できるという点でキーによく似ています。キーを使用して金庫内のアイテムにアクセスできるのと同じように、HTTP リクエスト ヘッダーで送信されたユーザーの SessionID Cookie を介して「金庫」の内容にアクセスできます。 ASP はページ要求を受信するたびに、HTTP 要求ヘッダーをチェックして SessionID Cookie を取得します。
SessionID Cookie がユーザーのブラウザに保存された後、ユーザーが別の .asp ファイルを要求した場合、または別のアプリケーションで実行されている .asp ファイルを要求した場合でも、ASP は引き続き Cookie を再利用してセッションを追跡します。同様に、ユーザーが意図的にセッションを放棄するか、セッションをタイムアウトさせてから別の .asp ファイルを要求すると、ASP は同じ Cookie を使用して新しいセッションを開始します。サーバー管理者がサーバーを再起動するか、ユーザーが Web ブラウザを再起動する場合にのみ、メモリに保存されている SessionID 設定がクリアされ、ユーザーは新しい SessionID Cookie を取得します。
SessionID Cookie を再利用することにより、ASP はユーザーのブラウザに送信される Cookie の数を最小限に抑えます。あるいは、ASP アプリケーションにセッション管理が必要ないと判断した場合は、ASP がセッションを追跡してユーザーに SessionID を送信しないようにすることもできます。
ASP は、次の状況ではセッション Cookie を送信しません。
アプリケーションのセッション状態は無効です。
ASP ページはセッションレスとして定義されます。つまり、ページには <%@ EnableSessionState=False %> タグが含まれます。
SessionID Cookie は、Web サイトへの複数回の訪問にわたってユーザーを追跡する永続的な方法を提供するものではないことに注意してください。サーバーのメモリに保存されている SessionID 情報は簡単に失われる可能性があります。 Web アプリケーションにアクセスするユーザーを長期にわたって追跡したい場合は、ユーザーの Web ブラウザに特別な Cookie を保存し、その Cookie 情報をデータベースに保存することにより、ユーザー ID を作成する必要があります。
Session オブジェクトにデータを保存する
Session オブジェクトは、情報を格納できる動的連想配列を提供します。 Session オブジェクトには数値変数とオブジェクト変数を格納できます。
変数は、Session オブジェクト内の名前付き項目に値を割り当てることで、Session オブジェクトに格納できます。たとえば、次のコマンドは 2 つの新しい変数を Session オブジェクトに保存します。
<%
Session("名") = "ジェフ"
Session("姓") = "スミス"
%>
この名前付き項目にアクセスすると、Session オブジェクトから情報を取得できます。たとえば、Session("FirstName") の現在の値を表示します。
ようこそ <%= Session("FirstName") %>
ユーザーの設定を Session オブジェクトに保存し、その設定にアクセスしてユーザーに送信するページを決定できます。たとえば、ユーザーがアプリケーションの最初のページでテキストのみのバージョンのコンテンツを指定できるようにし、この選択をユーザーがアクセスするアプリケーションの後続のすべてのページに適用することができます。
<% Session("ScreenResolution") = "Low" の場合 %>
これはページのテキスト版です。
<%その他%>
これはこのページのマルチメディア バージョンです。
<% % の場合は終了>
オブジェクト インスタンスを Session オブジェクトに格納することもできますが、そうするとサーバーのパフォーマンスに影響します。
Web ファームセッションを管理する
ASP セッション情報は Web サーバーに保存されます。ブラウザは、セッション情報へのアクセスに使用されるスクリプトを取得するために、Web サーバーにページを要求する必要があります。 Web ファーム (多くの Web サーバーがユーザー要求に応答する役割を分担している) では、ユーザー要求は常に同じサーバーにルーティングされるわけではなく、「負荷分散」プロセスと呼ばれる特別なソフトウェアによってサイトのアプリケーションにルーティングされます。任意の空きサーバーに割り当てられます。負荷分散プロセスにより、Web ファームでセッション情報を保存することがさらに困難になります。
負荷分散されたサイトで ASP セッション管理を使用するには、ユーザー セッションに対するすべての要求が同じ Web サーバーに送信されるようにする必要があります。 1 つの方法は、Response オブジェクトを使用してブラウザをユーザーのセッションを実行している Web サーバーにリダイレクトする Session_OnStart プロシージャを作成することです。アプリケーション ページ内のすべてのリンクが相対リンクである場合、ページに対する今後のすべてのリクエストは同じサーバーにルーティングされます。
たとえば、ユーザーはサイトのユニバーサル URL (http://www.microsoft.com) を要求してアプリケーションにアクセスしたいとします。負荷分散プロセスは、要求をサーバーserver3.microsoft.comにルーティングします。 ASP はこのサーバー上に新しいユーザー セッションを生成しました。 Session_OnStart プロセス中に、ブラウザは指定されたサーバーにリダイレクトされます。
<% Response.Redirect("http://server3.microsoft.com/webapps/firstpage.asp") %>
ブラウザは指定されたページをリクエストし、その後のすべてのリクエストは同じサーバーにルーティングされます。
クッキーを使用する
Cookie は、ユーザーを表すために Web サーバーがユーザーの Web ブラウザーに埋め込むトークンです。次回同じブラウザがページをリクエストすると、Web サーバーから受け取った Cookie が送信されます。 Cookie を使用すると、一連の情報をユーザーに関連付けることができます。 ASP スクリプトは、Response オブジェクトと Request オブジェクトの Cookie コレクションを使用して、Cookie 値を取得および設定します。
クッキーを設定する
Cookie の値を設定するには、Response.Cookies を使用します。 Cookie が存在しない場合、Response.Cookies は新しい Cookie を作成します。たとえば、Cookie 名 (「planet」) と関連付けられた値 (「Mars」) をブラウザに送信するには、次のコマンドを使用します。このコマンドは、Web ページの <HTML> タグの前に指定する必要があります。
<% Response.Cookies("planet")="火星" %>
現在のユーザー セッション中にのみ Cookie を使用したい場合は、Cookie をブラウザに送信するだけです。ただし、ブラウザを終了または再起動した後にユーザーを認識したい場合は、ブラウザに強制的に Cookie をコンピュータのハード ドライブに保存する必要があります。 Cookie を保存するには、Response.Cookies の Expires プロパティを使用し、日付を将来の日に設定します。
<%
Response.Cookies("惑星") = "火星"
Response.Cookies("planet").Expires = "1999 年 1 月 1 日"
%>
Cookie は複数の値を持つことができ、そのような Cookie はインデックス付き Cookie と呼ばれます。各 Cookie 値にはキーワードが割り当てられており、特定の Cookie キーワードの値を設定できます。例えば:
<% Response.Cookies("planet")("Mars")="SpaceMissions" %>
既存の Cookie にキーワード値があるが、Response.Cookies でキーワードの名前が指定されていない場合、キーワード値は削除されます。同様に、既存の Cookie にキーワード値がなくても、Response.Cookies でキーワードの名前と値が指定されている場合、既存の Cookie 値は削除され、新しいキーと値のペアが生成されます。
クッキーを取得する
Cookie の値を取得するには、Request.Cookies コレクションを使用します。たとえば、ユーザーの HTTP リクエストで Planet=Mars が設定されている場合、次のステートメントは値 Mars を取得します。
<%= Request.Cookies("planet") %>
同様に、インデックス付き Cookie からキーワード値を取得するには、キーワード名を使用します。たとえば、ユーザーが次の HTTP リクエストを実行したとします。
惑星=火星&火星=宇宙ミッション
次のスクリプトは値 SpaceMissions を返します。
<%= Request.Cookies("planet")("Mars") %>
Cookie パスの設定 ASP によってユーザーの Web ブラウザに保存される各 Cookie には、パス情報が含まれています。ブラウザが Cookie で指定されたパスと同じ場所にあるファイルを要求すると、ブラウザは自動的に Cookie をサーバーに転送します。デフォルトでは、Cookie のパスは、Cookie を最初に生成した .asp ファイルを含むアプリケーション名に対応します。たとえば、UserApplication という名前のアプリケーションの .asp ファイルが Cookie を生成する場合、ユーザーの Web ブラウザがこのアプリケーションのファイルを取得するたびに、ブラウザのこの Cookie もサーバーに転送されます。
デフォルトのアプリケーション パスとは異なる Cookie のパスを宣言するには、ASP の Response.Cookies コレクションの Path プロパティを使用します。たとえば、次のスクリプトはパス SalesApp/Customer/Profiles/ を Purchases という名前の Cookie に割り当てます。
<%
Response.Cookies("購入") = "12"
Response.Cookies("購入").Expires = "2001 年 1 月 1 日"
Response.Cookies("購入").Path = "/SalesApp/Customer/Profiles/"
%>
Purchases Cookie を含む Web ブラウザがパス /SalesApp/Customer/Profiles/ またはそのサブディレクトリにあるファイルを要求するたびに、ブラウザは Cookie をサーバーに転送します。
Microsoft Internet Explorer 4.0 や Netscape ブラウザなどの多くの Web ブラウザでは、Cookie パスの大文字と小文字が保持されます。つまり、要求されたファイルの大文字と小文字が予約された Cookie パスと異なる場合、ブラウザは Cookie をサーバーに転送しません。たとえば、ASP にとって、仮想ディレクトリ /TRAVEL と /travel は同じ ASP アプリケーションですが、URL の大文字と小文字を保持するブラウザにとって、/TRAVEL と /travel は 2 つの異なるアプリケーションです。ユーザーのブラウザが保存された Cookie を確実に転送できるように、.asp ファイルへのすべての URL の大文字と小文字が同じであることを確認する必要があります。
必要に応じて、次のステートメントを使用して Cookie パスを設定し、アプリケーションやパスに関係なく、ユーザーの Web ブラウザがサーバーからファイルを要求するたびに Cookie が転送されるようにすることができます。
Response.Cookies("購入").Path = "/"
ただし、指定されたアプリケーション以外のプログラムからアクセスできない機密情報が Cookie に含まれている場合、アプリケーションを区別せずに Cookie をサーバーに送信すると、セキュリティ上の問題が発生する可能性があることに注意してください。
Cookie を使用せずに状態を保持する すべてのブラウザが Cookie をサポートしているわけではありません。 Cookie をサポートするブラウザを使用している場合でも、一部のユーザーは Cookie サポートをオフにすることを好む場合があります。アプリケーションが Cookie をサポートしていないブラウザに応答する必要がある場合は、ASP セッション管理を使用する必要があります。
ASP セッション管理を使用しない場合は、アプリケーション ページ間で情報を渡す独自のメカニズムを作成する必要があります。このタスクを実行するには、一般的に次の 2 つの方法があります。
URL のクエリ文字列にパラメータを追加します。例えば:
http://MyServer/MyApp/start.asp?name=ジェフ
ただし、ブラウザによっては、フォームが GET メソッドで送信されるときに、クエリ文字列で渡された明示的なパラメータが破棄されます。
非表示の値をテーブルに追加します。たとえば、次の HTML テーブルには暗黙的なコントロールが含まれています。このコントロールは実際のフォームには表示されず、ユーザーの Web ブラウザには表示されません。 HTTP POST メソッドを通じて、フォームはユーザーが提供した情報に加えてユーザー ID を渡します。
<FORM METHOD="POST" ACTION="/scripts/inform.asp">
<INPUT TYPE="テキスト" NAME="都市" VALUE="">
<INPUT TYPE="テキスト" NAME="国" VALUE="">
<INPUT TYPE="hidden" NAME="userid" VALUE= <%=UserIDNum(i) %>
<INPUT TYPE="送信" VALUE="入力">
この方法では、ユーザー情報を転送するすべてのリンク ターゲットが HTML テーブルとしてエンコードされている必要があります。
現在 ASP セッション管理を使用していない場合は、アプリケーションのセッション サポートをオフにします。セッションが有効になると、ASP は ASP ページを要求する各ブラウザに SessionID Cookie を送信します。セッション サポートをオフにするには、インターネット サービス マネージャーの [アプリケーション オプション] プロパティ ページで [セッション状態を有効にする] チェック ボックスをオフにします。
セッションレスASPページ
ASP には、セッションレス ページを作成する機能も用意されており、これを使用すると、セッション追跡が必要な ASP ページにユーザーがアクセスするまでセッションの作成を延期できます。
セッションレス ページは次の機能を実行しません。
Session_OnStart プロシージャを実行します。
セッションIDクッキーを送信します。
セッションオブジェクトを作成します。
組み込みのセッション オブジェクト、または <OBJECT> タグで作成されたセッション スコープのオブジェクトにアクセスします。
他のセッションリクエストと連続して実行されます。
.asp をセッションレスになるように構成するには、次のステートメントを使用します。
<%@ EnableSessionState=False %>
このスクリプトは、.asp ファイルの最初の行、他のスクリプトの前に配置する必要があります。デフォルトでは、このフラグを省略すると、セッション追跡が有効になります。
セッションレス ASP ページは、時間のかかる可能性のあるセッション操作を排除することで、サーバーの応答パフォーマンスを向上させます。たとえば、次の状況を考えてみましょう。ASP ページには、フレーム セットに 2 つの HTML フレーム、フレーム 1 とフレーム 2 が含まれています。フレーム 1 には複雑なスクリプトを実行する .asp ファイルが含まれ、フレーム 2 には単純な .html ファイルが含まれています。 ASP はセッション要求を順番に (つまり、逐次的に) 実行するため、フレーム 1 のスクリプトが実行されるまでフレーム 2 の内容は表示されません。ただし、フレーム 1 をセッションレスに設定すると、ASP リクエストはシリアルに処理されなくなり、ブラウザはフレーム 2 のコンテンツを処理する前に、フレーム 1 のコンテンツの実行が完了するのを待つ必要がなくなります。
ただし、異なるフレームに対する複数のリクエストがどのように処理されるかは、最終的にはユーザーの Web ブラウザーの構成によって異なります。一部の Web ブラウザーは、.asp ファイルのセッションレス構成を無視し、要求をシリアルに処理する場合があります。