この章では、XMLタグを使用したセッションとCookieの管理方法について説明します。
この章には次の項が含まれます。
main
およびwater
という2つのページが含まれているWebサイトを考えてみましょう。訪問者は最初にmain
を見た後でwater
に移動するとします。HTTPはステートレスなプロトコルです。そのため、標準的なWebサーバーでこのサイトを管理している場合、main
で収集されたナレッジは訪問者がwater
に移動したときに失われてしまいます。つまり、water
では、訪問者がmain
で提供できた可能性のある情報を利用できないことになります。
この制約を回避するために、アプリケーション・サーバーは訪問者が最初にWebサイトに入った時点を検出します。その時点で、アプリケーション・サーバーは訪問者に対してセッションを開始します。前述の例では、訪問者がmain
ページをリクエストした時点でアプリケーション・サーバーはセッションを開始しています。Webサイト・デザイナはmain
を使用して訪問者に関する情報を収集し、その情報をセッション変数に格納できます。セッション変数に格納された情報は、すべての後続ページで利用できます。したがって、たとえばBobが自分の年齢をmain
に指定して、main
のデザイナがその年齢をセッション変数に書き込んだ場合、water
ではBobの年齢に簡単にアクセスできます。
セッション変数に格納された値は、そのセッションが継続する間は使用できます。セッションが終了すると、アプリケーション・サーバーはそのセッションに関連付けられたセッション変数を破棄します。各セッション変数はアプリケーション・サーバー上でメモリーを消費するため、不必要なセッション変数の作成はパフォーマンスの低下につながります。
WebCenter Sitesでは一部のセッション変数が自動作成されますが、Webサイト開発者はオプションとしてその他のセッション変数を作成できます。
アプリケーション・サーバーは、セッションをクラスタ上で保持できます。
セッションは、訪問者が初めてWebサイトを訪れたときに始まります。セッションは、次のいずれかが生じたときに終了します。
訪問者がブラウザを終了します。
セッションがタイムアウトしました。WebCenter Sitesは、cs.timeout
プロパティを使用してセッション・タイムアウト値をアプリケーション・サーバーに設定します。このプロパティを300に設定した場合、ユーザー・セッションは300秒、すなわち5分で無効になります。
システム管理者がアプリケーション・サーバーを停止します。
この項の内容は、次のとおりです。
セッションが作成されると、WebCenter Sitesは自動的に次のセッション変数を作成します。
表9-1 セッション変数
セッション変数 | 保持される内容 |
---|---|
|
ログインした訪問者の |
|
この訪問者が属するすべてのACLのカンマ区切りリスト。訪問者が明示的にログインしていない場合、デフォルトACLは |
|
この訪問者のログイン時のユーザー名。訪問者が明示的にログインしていない場合、デフォルトのユーザー名は |
|
WebCenter Sitesのプロパティが含まれているファイルの名前。 |
訪問者が初めてサイトを訪れると、WebCenter Sitesでセッションが作成され、訪問者はDefaultReader
として暗黙的にログインされます。セッション中に訪問者が明示的にログインした場合、WebCenter SitesはSessionVariables.currentUser, SessionVariables.currentAcl
およびSessionVariables.username
の値を自動的に更新します。ログインによって、その他のセッション変数の値が影響を受けることはありません。つまり、ログイン前にページでセッション変数が作成された場合、その値はログイン後も有効です。訪問者が明示的にログアウトすると、WebCenter Sitesで生成されたセッション変数はログイン前に保持されていた値に自動的に戻ります。たとえば、次の順序を考えてみましょう。
訪問者が初めてページにアクセスした場合、SessionVariables.username
の値はDefaultReader
です。
訪問者がmarilynとしてログインすると、SessionVariables.username
の値はmarilyn
になります。
marilynがログアウトすると、SessionVariables.username
の値はDefaultReader
に戻ります。
ログアウトをトリガーするには、<CATALOGMANAGER>
タグをftcmd=logout
修飾子と同時に呼び出します。このタグを発行すると、オプションとして、現在のセッションを破棄するkillsession
修飾子を指定できます。さらに、<CATALOGMANAGER>
タグをftcmd=login
修飾子と同時に呼び出すことによって、セッションを新規作成できます。
次に、3つの非常に短いエレメントで構成される簡単なセッションの例を示します。
表9-2 セッションの例
エレメント | 動作 |
---|---|
|
訪問者に現在の気分を指定するように依頼します。 |
|
現在の気分をセッション変数に割り当てます。 |
|
セッション変数を評価します。 |
この項の内容は、次のとおりです。
フィーリング・フォームは実際にはセッションまたは変数を含んでいません。このエレメントは、単にフォームを生成するのみです。訪問者の選択した気分は、次のようにSetFeeling
エレメントに渡されます。
<form action="ContentServer" method="post"> <input type="hidden" name="pagename" value="CSGuide/Sessions/SetFeelings"/> <P>How are you feeling right now?</P> <P> <select name="Feeling" size="1"> <option>Good</option> <option>Not so Good</option> </select> </P> <P><input type="submit" name="doit" value="Submit"/></P> </form>
この結果、次のようなページが生成されます。
「送信」ボタンをクリックすると、訪問者はSetFeeling
に転送されます。このエレメントにより、訪問者の気分はCurrentFeeling
という新規のセッション変数に割り当てられます。
<SETSSVAR NAME="CurrentFeeling" VALUE="Variables.Feeling"/> <P>Welcome to our site.</P> <P>Now proceed to <A href="ContentServer?pagename=CSGuide/Sessions/Meat"> some meaty content. </A></P>
この結果、次のようなページが生成されます。
Welcome to our site. Now proceed to some meaty content.
このアプリケーションのエレメントが訪問者にログインするよう要求した場合、WebCenter Sitesはusername
セッション変数を自動的に訪問者のログイン名に設定します。その場合は、ようこそメッセージをSetFeeling
で次のようにパーソナライズすることもできます。
<P>Welcome to our site, <CSVAR NAME="SessionVariables.username"/> </P>
「some meaty content」をクリックすると、訪問者はMeat
ページに転送されます。このページでは、セッション変数が評価されます。
<IF COND="SessionVariables.CurrentFeeling=Good"> <THEN> <P>Sessions are happiness.</P> </THEN> <ELSE> <P>Don't let sessions get you down.</P> </ELSE> </IF>
気分のすぐれない訪問者には、次のメッセージが表示されます。
Don't let sessions get you down.
CurrentFeeling
がMeat
に対してどのように使用可能になったかに注目してください。実際に、CurrentFeeling
はセッション内のその他すべてのエレメントでも使用可能です。
Cookieは、アプリケーションが訪問者のブラウザに書き込む文字列です。Cookieには、セッションを継続している訪問者に関する情報が格納されます。訪問者のブラウザは、この文字列を訪問者のディスク上の特別なCookieに書き込みます。訪問者がWebサイトに戻ったときに、訪問者のブラウザはCookieを設定したWebサーバーにCookieのコピーを返送します。Cookieは、作成されるとただちに、ページ上のエレメントの変数として使用可能になります。
たとえば、アプリケーションで訪問者のお気に入りのスポーツ・チームがCookieに格納されているとします。その場合は、訪問者が戻ったときにアプリケーションはCookieを取得し、その情報を使用してチーム・ロゴをバナーに表示することもできます。
Cookieが不要に成った場合は、削除できます。
この項の内容は、次のとおりです。
CookieServerは、ユーザーにかわってCookieを設定するサーブレットです。CookieServerにアクセスするには、satellite.cookie
タグを使用してCookieを作成します。
WebCenter Sitesには、Cookieの管理用に次の2つのタグがあります。
表9-3 Cookieのタグ
タグ | 使用法 |
---|---|
|
クライアントのブラウザにCookieを設定します。 |
|
クライアントのブラウザからCookieを削除します。 |
Cookieの値を取得する特殊なタグはありません。かわりに、訪問者がWebサイトに戻ると、WebCenter SitesはCookieの値を標準変数としてロードします。
(satellite.cookie
を呼び出すことにより)Cookieを作成するときに、次の属性を指定できます。
表9-4 Cookieの属性
属性 | 値 |
---|---|
|
Cookieの名前。これは、Cookieの値が含まれている受信変数の名前としても機能します。 重要: WebCenter Sitesのページ・コンテキストのCookieは、変数として扱われます。したがって、Cookieとアセット属性の名前が同じであれば、同じ変数として扱われます。 |
|
Cookieが今後Webサーバーに送信されなくなるまでの時間(秒)。 |
|
オプションとして、Cookieにセキュリティを設定します。 |
|
CookieがこのURLのみで送信されるように制限します。 |
|
Cookieが指定されたドメインのURLのみに送信されるように制限します。 |
一部の訪問者は、Cookieはセキュリティ上の脅威と感じて、Cookieを拒否するようにブラウザを構成することがあります。Cookieの情報が重要である場合に備えて、アプリケーションを構成する必要があります。
任意のタグを使用してコンテンツを訪問者のブラウザに戻す前に、Cookieの設定または削除を行う必要があります。<HTML>
タグを使用する前であっても、Cookieの設定または削除が必要です。
この例は、非常に短い複数のエレメントで構成されています。
表9-5 Cookieのエレメント
エレメント | 動作 |
---|---|
|
Cookieが設定されているかどうかを判別します。Cookieが設定されている場合は、 |
|
訪問者にお気に入りの色を選択するように要求するフォームを表示します。 |
|
この訪問者のブラウザにCookieを作成します。その後で、訪問者を |
|
簡単なようこそメッセージを訪問者のお気に入りの色で表示します。 |
この項の内容は、次のとおりです。
Start.xml
エレメントは、Cookieがすでに設定されているかどうかを判別します。Cookieが設定されている場合、WebCenter Sitesはその値をVariables.ColorCookie
という標準変数に格納します。Start.xml
のコードは次のようになります。
<IF COND="IsVariable.ColorCookie=true"> <THEN> <CALLELEMENT NAME="CSGuide/Sessions/DisplayWelcome"/> </THEN> <ELSE> <CALLELEMENT NAME="CSGuide/Sessions/ColorForm"/> </ELSE> </IF>
ColorForm.xml
エレメントは、訪問者のお気に入りの色を収集するHTMLフォームを表示します。ColorForm.xml
のコードは次のようになります。
<form action="ContentServer" method="post"> <input type="hidden" name="pagename" value="CSGuide/Sessions/CreateCookie"/> <P>What is your favorite color?</P> <P> <select name="FavoriteColor" size="1"> <option>Red</option> <option>Green</option> <option>Blue</option> </select> </P> <P><input type="submit" name="doit" value="Submit"/></P> </form>
CreateCookie.xml
エレメントは、ColorCookie
というCookieを訪問者のブラウザに送信します。訪問者がCookieを無効化した場合、ブラウザはCookieを設定するようにというリクエストを無視します。訪問者がCookieを有効化した場合(デフォルト)、ブラウザはCookieをこのシステムのCookieファイルに書き込みます。
次に、CreateCookie.xml
のコードを示します。
<satellite.cookie NAME="ColorCookie" VALUE="Variables.FavoriteColor" TIMEOUT="31536000" SECURE="false"/> <CALLELEMENT NAME="CSGuide/Sessions/DisplayWelcome"/>
このコードでは、Cookieの値が訪問者のお気に入りの色に設定されます。このCookieは1年間(31,536,000秒)継続します。
DisplayWelcomeが呼び出されるときまでに、Cookieが設定されます。次のコードでは、ようこそメッセージを訪問者のお気に入りの色で表示するためにCookieの値が使用されます。
<H1><font color="Variables.ColorCookie" REPLACEALL="Variables.ColorCookie"> Displaying a Friendly Welcome. </font></H1>
Cookie例を実行するには、ブラウザを使用して次のページ名に移動します。
CSGuide/Sessions/Start
この例を初めて実行すると、4つのエレメントがすべて実行されます。2回目以降は、Start
とDisplayWelcome
のみが実行されます。
次の提案が役に立つ場合があります。
クラスタでは、セッション状態をクラスタ・メンバー全員にレプリケートする必要があります。クラスタでは、セッション・サイズを最小限に抑え、1クライアントにつき2キロバイトを超えるセッションを格納しないようにしてください。
妥当なセッション・タイムアウト値を決定します。設定するタイムアウト値が大きすぎると、システム・リソースが拘束されてしまいます。タイムアウト値が小さすぎると、訪問者は何回もログインしなければなりません。
パーソナライズしたコンテンツを訪問者に提供するWebサイトでは、セッションの追跡が必要です。WebCenter SitesとSatellite Serverはいずれもセッションを追跡します。双方で訪問者のブラウザにCookieが設定されるため、(1つではなく)2つのCookieがそれぞれ独立してセッションを追跡します。この冗長性はSatellite Serverが停止した場合に役立ちます。Satellite Serverが停止しても、WebCenter Sitesセッションは保持されるためです。
Satellite Serverはセッション固有のページレットを最初の依頼者に返送するだけですが、ユーザーのログアウト時にセッション固有の情報を明示的にフラッシュすることで、Satellite Serverキャッシュの領域が確保されます。
次の各セクションでは、Satellite Serverからセッション情報をフラッシュする方法について説明します。
この項の内容は、次のとおりです。
特定のセッションに関連するすべてのデータをフラッシュできます。これは、フォームを次のフォーマットでURLにポストすることで、WebCenter Sitesから実行します。
https://host:port/servlet/
FlushServer?reset=true&username=username&password=password& ssid=sessionID
ここで:
現在使用しているSatellite Serverセッションの情報をフラッシュするには、現行セッションIDを持つFlushServer
URLを使用します。現行セッションID (ssid
)は、アプリケーション・サーバーに依存する名前を持ったセッション変数に格納されます。この名前を確認するには、セッション変数HTTP_COOKIE
を参照します。
次のjavaコードでは、現行セッションの情報がフラッシュされます。
String value; String name = "WebLogicSession"; value = ics.GetVar(name); String sFlushSessionUrl ="http://mysatellite:80/servlet/
FlushServer?username=ftuser&password=ftuser& reset=true&ssid=" + value;"
String sSatTest1Results = Utilities.readURL(sFlushSessionUrl);
現在使用しているセッション以外のセッションから情報をフラッシュするには、次の手順を実行します。
フラッシュするページレットが含まれているコンテナ・ページに次のタグを追加します。
<satellite.page pagename="QA/Satellite/Functional/xml/pagelet4" cachecontrol="session:0:00:00 */*/*"/>
"session:0:00:00 */*/*"
のcachecontrol
値は、このページをリクエストするセッションごとに、そのセッションによる後続リクエストのみで表示可能なページレットが作成されることを示します。指定されたページのセッションが失効すると、そのページは二度と表示できなくなります。コンテナ・ページは、毎日の真夜中にキャッシュから失効します。
コンテナ・ページに対してcachecontrolパラメータを設定した後で、キー・パラメータを持つInventoryサーブレットを使用してセッションID (ssid
)を取得します。ssid
は、プロトコルとサーバー名の前の文字列です。たとえば、Inventoryサーブレットが次のように表示されたとします。
OuCOTrh9yporWfgu8Uthttp://myserver:80/servlet/ ContentServer?pagename=QA/Satellite/Functional/xml/pagelet4
この場合、ssid
はOuCOTrh9yporWfgu8U
になります。
セッションから情報をフラッシュするには、FlushServer URLにあるssid
を使用します。例:
http://myserver:80/servlet/ FlushServer?username=ftuser&password=ftuser&reset=true&
ssid=OuCOTrh9yporWfgu8U
注意: 現在使用しているセッション以外のセッションから情報をフラッシュする場合は、セッション・アフィニティを有効にしておくことをお薦めします。 |