サーブレット-セッショントラッキング
HTTPは「ステートレス」プロトコルです。つまり、クライアントがWebページを取得するたびに、クライアントはWebサーバーへの個別の接続を開き、サーバーは以前のクライアント要求の記録を自動的に保持しません。
それでも、WebクライアントとWebサーバー間のセッションを維持するには次の3つの方法があります-
クッキー
Webサーバーは、一意のセッションIDをCookieとして各Webクライアントに割り当てることができ、クライアントからの後続の要求では、受信したCookieを使用してそれらを認識することができます。
多くの場合、ブラウザはCookieをサポートしていないため、これは効果的な方法ではない可能性があります。そのため、この手順を使用してセッションを維持することはお勧めしません。
非表示のフォームフィールド
Webサーバーは、次のように、非表示のHTMLフォームフィールドを一意のセッションIDとともに送信できます。
<input type = "hidden" name = "sessionid" value = "12345">
このエントリは、フォームが送信されると、指定された名前と値がGETまたはPOSTデータに自動的に含まれることを意味します。Webブラウザーが要求を送り返すたびに、session_id値を使用してさまざまなWebブラウザーを追跡できます。
これはセッションを追跡する効果的な方法ですが、通常の(<A HREF ...>)ハイパーテキストリンクをクリックしてもフォームは送信されないため、非表示のフォームフィールドも一般的なセッション追跡をサポートできません。
URL書き換え
セッションを識別する各URLの末尾にいくつかの追加データを追加でき、サーバーはそのセッションIDをそのセッションに関して保存されているデータに関連付けることができます。
たとえば、http://tutorialspoint.com/file.htm; sessionid = 12345の場合、セッション識別子はsessionid = 12345として添付され、Webサーバーでアクセスしてクライアントを識別できます。
URL書き換えはセッションを維持するためのより良い方法であり、ブラウザがCookieをサポートしていない場合でも機能します。URL書き換えの欠点は、単純な静的HTMLページの場合でも、セッションIDを割り当てるためにすべてのURLを動的に生成する必要があることです。
HttpSessionオブジェクト
上記の3つの方法とは別に、サーブレットはHttpSessionインターフェイスを提供します。これは、複数のページ要求またはWebサイトへのアクセスでユーザーを識別し、そのユーザーに関する情報を格納する方法を提供します。
サーブレットコンテナは、このインターフェイスを使用して、HTTPクライアントとHTTPサーバーの間にセッションを作成します。セッションは、ユーザーからの複数の接続またはページ要求にわたって、指定された期間持続します。
publicメソッドを呼び出すことでHttpSessionオブジェクトを取得します getSession() 以下のように、HttpServletRequestの
HttpSession session = request.getSession();
ドキュメントコンテンツをクライアントに送信する前に、request.getSession()を呼び出す必要があります。これは、HttpSessionオブジェクトを介して利用できる重要なメソッドの要約です-
シニア番号 | 方法と説明 |
---|---|
1 | public Object getAttribute(String name) このメソッドは、このセッションで指定された名前でバインドされたオブジェクトを返します。名前でバインドされたオブジェクトがない場合はnullを返します。 |
2 | public Enumeration getAttributeNames() このメソッドは、このセッションにバインドされているすべてのオブジェクトの名前を含むStringオブジェクトの列挙を返します。 |
3 | public long getCreationTime() このメソッドは、このセッションが作成された時刻を返します。これは、1970年1月1日GMTの午前0時からミリ秒単位で測定されます。 |
4 | public String getId() このメソッドは、このセッションに割り当てられた一意の識別子を含む文字列を返します。 |
5 | public long getLastAccessedTime() このメソッドは、セッションの最後にアクセスされた時刻を、1970年1月1日午前0時からのミリ秒の形式で返します。GMT |
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>"
);
}
}
上記のサーブレットをコンパイルします SessionTrackweb.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
同じサーブレットをもう一度実行しようとすると、次の結果が表示されます。
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
セッションデータの削除
ユーザーのセッションデータを使い終わったら、いくつかのオプションがあります-
Remove a particular attribute− public void removeAttribute(String name)メソッドを呼び出して、特定のキーに関連付けられている値を削除できます。
Delete the whole session− public void invalidate()メソッドを呼び出して、セッション全体を破棄できます。
Setting Session timeout− public void setMaxInactiveInterval(int interval)メソッドを呼び出して、セッションのタイムアウトを個別に設定できます。
Log the user out −サーブレット2.4をサポートするサーバー。 logout クライアントをWebサーバーからログアウトし、すべてのユーザーに属するすべてのセッションを無効にします。
web.xml Configuration − Tomcatを使用している場合、上記の方法とは別に、次のようにweb.xmlファイルでセッションタイムアウトを構成できます。
<session-config>
<session-timeout>15</session-timeout>
</session-config>
タイムアウトは分で表され、Tomcatのデフォルトのタイムアウトである30分を上書きします。
サーブレットのgetMaxInactiveInterval()メソッドは、そのセッションのタイムアウト期間を秒単位で返します。したがって、セッションがweb.xmlで15分間構成されている場合、getMaxInactiveInterval()は900を返します。