Servlets-session-tracking

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

サーブレット-セッショントラッキング

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

それでも、WebクライアントとWebサーバー間のセッションを維持するには、次の3つの方法があります-

クッキー

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の末尾にいくつかの追加データを追加でき、サーバーはそのセッションIDをそのセッションに関して保存したデータに関連付けることができます。

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

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

HttpSessionオブジェクト

上記の3つの方法とは別に、サーブレットはHttpSessionインターフェイスを提供します。これにより、複数のページリクエストでユーザーを識別したり、Webサイトにアクセスしたり、そのユーザーに関する情報を保存したりできます。

サーブレットコンテナはこのインターフェイスを使用して、HTTPクライアントとHTTPサーバー間のセッションを作成します。 セッションは、ユーザーからの複数の接続またはページ要求にわたって、指定された期間持続します。

以下のように、HttpServletRequestのパブリックメソッド* getSession()*を呼び出して、HttpSessionオブジェクトを取得します-

HttpSession session = request.getSession();

ドキュメントコンテンツをクライアントに送信する前に、_request.getSession()_を呼び出す必要があります。 ここにHttpSessionオブジェクトを介して利用可能な重要なメソッドの概要があります-

Sr.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日午前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オブジェクトを使用して、セッションの作成時刻と最終アクセス時刻を確認する方法について説明します。 セッションがまだ存在しない場合は、新しいセッションをリクエストに関連付けます。

//Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;

//Extend HttpServlet class
public class SessionTrack extends HttpServlet {

   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

     //Create a session object if it is already not  created.
      HttpSession session = request.getSession(true);

     //Get session creation time.
      Date createTime = new Date(session.getCreationTime());

     //Get last access time of this web page.
      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 web page.
      if (session.isNew()) {
         title = "Welcome to my website";
         session.setAttribute(userIDKey, userID);
      } else {
         visitCount = (Integer)session.getAttribute(visitCountKey);
         visitCount = visitCount + 1;
         userID = (String)session.getAttribute(userIDKey);
      }
      session.setAttribute(visitCountKey,  visitCount);

     //Set response content type
      response.setContentType("text/html");
      PrintWriter out = response.getWriter();

      String docType =
         "<!doctype html public \"-//w3c//dtd html 4.0 " +
         "transitional//en\">\n";

      out.println(docType +
         "<html>\n" +
            "<head><title>" + title + "</title></head>\n" +

            "<body bgcolor = \"#f0f0f0\">\n" +
               "<h1 align = \"center\">" + title + "</h1>\n" +
               "<h2 align = \"center\">Session Infomation</h2>\n" +
               "<table border = \"1\" align = \"center\">\n" +

                  "<tr bgcolor = \"#949494\">\n" +
                     "  <th>Session info</th><th>value</th>
                  </tr>\n" +

                  "<tr>\n" +
                     "  <td>id</td>\n" +
                     "  <td>" + session.getId() + "</td>
                  </tr>\n" +

                  "<tr>\n" +
                     "  <td>Creation Time</td>\n" +
                     "  <td>" + createTime + "  </td>
                  </tr>\n" +

                  "<tr>\n" +
                     "  <td>Time of Last Access</td>\n" +
                     "  <td>" + lastAccessTime + "  </td>
                  </tr>\n" +

                  "<tr>\n" +
                     "  <td>User ID</td>\n" +
                     "  <td>" + userID + "  </td>
                  </tr>\n" +

                  "<tr>\n" +
                     "  <td>Number of visits</td>\n" +
                     "  <td>" + visitCount + "</td>
                  </tr>\n" +
               "</table>\n" +
            "</body>
         </html>"
      );
   }
}

上記のサーブレット SessionTrack をコンパイルし、web.xmlファイルに適切なエントリを作成します。 _http://localhost:8080/SessionTrack_を実行すると、初めて実行するときに次の結果が表示されます-

Welcome to my website
Session Infomation
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

次に、同じサーブレットを2回実行しようとすると、次の結果が表示されます。

Welcome Back to my website
Session Infomation
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を返します。