Jsp-session-tracking

提供:Dev Guides
移動先:案内検索

JSP-セッショントラッキング

この章では、JSPでのセッショントラッキングについて説明します。 HTTPは「ステートレス」プロトコルであり、クライアントがWebページを取得するたびに、クライアントはWebサーバーへの個別の接続を開き、サーバーは以前のクライアント要求の記録を自動的に保持しません。

Webクライアントとサーバー間のセッションの維持

WebクライアントとWebサーバー間のセッションを維持するためのいくつかのオプションについて説明しましょう。

クッキー

Webサーバーは、一意のセッションIDをCookieとして各Webクライアントに割り当てることができ、クライアントからの後続の要求については、受信したCookieを使用して認識できます。

ブラウザはCookieをサポートしない場合があるため、これは効果的な方法ではない場合があります。 この手順を使用してセッションを維持することはお勧めしません。

非表示のフォームフィールド

Webサーバーは、次のように一意のセッションIDと一緒に非表示のHTMLフォームフィールドを送信することができます-

<input type = "hidden" name = "sessionid" value = "12345">

このエントリは、フォームが送信されると、指定された名前と値が GET または POST データに自動的に含まれることを意味します。 Webブラウザーが要求を送り返すたびに、 session_id 値を使用して、さまざまなWebブラウザーを追跡できます。

これはセッションを追跡する効果的な方法ですが、通常の(<A HREF…​>)ハイパーテキストリンクをクリックしてもフォームが送信されないため、非表示のフォームフィールドも一般的なセッショントラッキングをサポートできません。

URLの書き換え

各URLの末尾に追加データを追加できます。 このデータはセッションを識別します。サーバーは、そのセッション識別子を、そのセッションに関して保存したデータに関連付けることができます。

たとえば、 http://finddevguides.com/file; sessionid = 12345 の場合、セッション識別子は sessionid = 12345 として添付され、クライアントを識別するためにWebサーバーでアクセスできます。

URL書き換えは、セッションを維持するためのより良い方法であり、ブラウザがCookieをサポートしていない場合に機能します。 ここでの欠点は、ページが単純な静的HTMLページであるにもかかわらず、セッションIDを割り当てるためにすべてのURLを動的に生成する必要があることです。

セッションオブジェクト

上記のオプションとは別に、JSPはHttpSession Interfaceで提供されるサーブレットを使用します。 このインターフェイスは、ユーザーを識別する方法を提供します。

  • 1ページのリクエストまたは
  • ウェブサイトにアクセスするか
  • そのユーザーに関する情報を保存する

デフォルトでは、JSPでセッショントラッキングが有効になっており、新しいクライアントごとに新しいHttpSessionオブジェクトが自動的にインスタンス化されます。 セッショントラッキングを無効にするには、次のようにページディレクティブセッション属性をfalseに設定して、明示的にオフにする必要があります-

<%@ page session = "false" %>

JSPエンジンは、暗黙的な session オブジェクトを介してHttpSessionオブジェクトをJSP作成者に公開します。 session オブジェクトはすでにJSPプログラマーに提供されているため、プログラマーは初期化や* getSession()*なしですぐにオブジェクトのデータの保存と取得を開始できます。

セッションオブジェクトを介して利用できる重要なメソッドの概要を次に示します-

S.No. Method & Description
1

public Object getAttribute(String name)

このメソッドは、このセッションで指定された名前でバインドされたオブジェクトを返します。名前の下にオブジェクトがバインドされていない場合はnullを返します。

2

public Enumeration getAttributeNames()

このメソッドは、このセッションにバインドされたすべてのオブジェクトの名前を含むStringオブジェクトの列挙を返します。

3

public long getCreationTime()

このメソッドは、このセッションが作成された時刻を、GMT 1970年1月1日午前0時からミリ秒単位で測定して返します。

4

public String getId()

このメソッドは、このセッションに割り当てられた一意の識別子を含む文字列を返します。

5

public long getLastAccessedTime()

このメソッドは、クライアントがこのセッションに関連付けられたリクエストを最後に送信した時刻を、1970年1月1日GMTの午前0時からのミリ秒数で返します。

6

public int getMaxInactiveInterval()

このメソッドは、サーブレットコンテナがクライアントアクセス間でこのセッションを開いたままにする最大時間間隔を秒単位で返します。

7

public void invalidate()

このメソッドは、このセッションを無効にし、それにバインドされているオブジェクトのバインドを解除します。

8

public boolean isNew()

このメソッドは、クライアントがセッションについてまだ知らない場合、またはクライアントがセッションに参加しないことを選択した場合にtrueを返します。

9

public void removeAttribute(String name)

このメソッドは、指定された名前でバインドされたオブジェクトをこのセッションから削除します。

10

public void setAttribute(String name, Object value)

このメソッドは、指定された名前を使用して、このセッションにオブジェクトをバインドします。

11

public void setMaxInactiveInterval(int interval)

このメソッドは、サーブレットコンテナがこのセッションを無効にするまでのクライアントリクエスト間の時間を秒単位で指定します。

セッショントラッキングの例

この例では、HttpSessionオブジェクトを使用して、セッションの作成時刻と最終アクセス時刻を確認する方法について説明します。 セッションがまだ存在しない場合は、新しいセッションをリクエストに関連付けます。

<%@ page import = "java.io.*,java.util.*" %>
<%
  //Get session creation time.
   Date createTime = new Date(session.getCreationTime());

  //Get last access time of this Webpage.
   Date lastAccessTime = new Date(session.getLastAccessedTime());

   String title = "Welcome Back to my website";
   Integer visitCount = new Integer(0);
   String visitCountKey = new String("visitCount");
   String userIDKey = new String("userID");
   String userID = new String("ABCD");

  //Check if this is new comer on your Webpage.
   if (session.isNew() ){
      title = "Welcome to my website";
      session.setAttribute(userIDKey, userID);
      session.setAttribute(visitCountKey,  visitCount);
   }
   visitCount = (Integer)session.getAttribute(visitCountKey);
   visitCount = visitCount + 1;
   userID = (String)session.getAttribute(userIDKey);
   session.setAttribute(visitCountKey,  visitCount);
%>

<html>
   <head>
      <title>Session Tracking</title>
   </head>

   <body>
      <center>
         <h1>Session Tracking</h1>
      </center>

      <table border = "1" align = "center">
         <tr bgcolor = "#949494">
            <th>Session info</th>
            <th>Value</th>
         </tr>
         <tr>
            <td>id</td>
            <td><% out.print( session.getId()); %></td>
         </tr>
         <tr>
            <td>Creation Time</td>
            <td><% out.print(createTime); %></td>
         </tr>
         <tr>
            <td>Time of Last Access</td>
            <td><% out.print(lastAccessTime); %></td>
         </tr>
         <tr>
            <td>User ID</td>
            <td><% out.print(userID); %></td>
         </tr>
         <tr>
            <td>Number of visits</td>
            <td><% out.print(visitCount); %></td>
         </tr>
      </table>

   </body>
</html>

上記のコードを main.jsp に配置し、 _ http://localhost:8080/main.jsp_ にアクセスしてみます。 URLを実行すると、次の結果が表示されます-

私のウェブサイトへようこそ

セッション情報

Session info value
id 0AE3EC93FF44E3C525B4351B77ABB2D5
Creation Time Tue Jun 08 17:26:40 GMT+04:00 2010
Time of Last Access Tue Jun 08 17:26:40 GMT+04:00 2010
User ID ABCD
Number of visits 0

同じJSPを2回実行しようとすると、次の結果が表示されます。

私のウェブサイトにようこそ

セッション情報

info type value
id 0AE3EC93FF44E3C525B4351B77ABB2D5
Creation Time Tue Jun 08 17:26:40 GMT+04:00 2010
Time of Last Access Tue Jun 08 17:26:40 GMT+04:00 2010
User ID ABCD
Number of visits 1

セッションデータの削除

あなたがユーザーのセッションデータで完了したら、いくつかのオプションがあります-

  • 特定の属性を削除- public void removeAttribute(String name) メソッドを呼び出して、特定のキーに関連付けられた値を削除できます。
  • セッション全体を削除- public void invalidate() メソッドを呼び出して、セッション全体を破棄できます。
  • セッションタイムアウトの設定- public void setMaxInactiveInterval(int interval) メソッドを呼び出して、セッションのタイムアウトを個別に設定できます。
  • ユーザーのログアウト-サーブレット2.4をサポートするサーバーでは、 logout を呼び出してクライアントをWebサーバーからログアウトし、すべてのユーザーに属するすべてのセッションを無効にすることができます。
  • * web.xmlの構成*-Tomcatを使用している場合、上記の方法とは別に、次のようにweb.xmlファイルでセッションタイムアウトを構成できます。
<session-config>
   <session-timeout>15</session-timeout>
</session-config>

タイムアウトは分単位で表され、Tomcatのデフォルトのタイムアウトである30分をオーバーライドします。

サーブレットの* getMaxInactiveInterval()メソッドは、そのセッションのタイムアウト期間を秒単位で返します。 したがって、セッションがweb.xmlで15分間構成されている場合、 getMaxInactiveInterval()*は900を返します。