HTTP はステートレス プロトコルです。つまり、クライアントが Web ページを取得するたびに別のサーバー接続が開かれるため、サーバーは以前のクライアント要求からの情報を記録しません。
クライアント/サーバー セッションを維持するには 3 つの方法があります。
Web サーバーは、各クライアントを表す一意のセッション ID を Cookie として割り当て、そのクライアントからの後続のリクエストを識別できます。
ブラウザは必ずしも Cookie をサポートしていないことが多いため、これは効率的な方法ではない可能性があります。そのため、セッションを維持するためにこの方法を使用することはお勧めしません。
Web サーバーは、次のように、非表示の HTML フォーム フィールドと一意のセッション ID を送信できます。
<input type="hidden" name="sessionid" value="12345">
このエントリは、フォームが送信されるときに、指定された名前と値が GET または POST データに自動的に含まれることを意味します。ブラウザがリクエストを送信するたびに、session_id の値を使用して、さまざまなブラウザのトレースを保存できます。
このアプローチは効率的なアプローチである可能性がありますが、<A HREF> タグ内のハイパーリンクをクリックしてもフォーム送信イベントは生成されないため、非表示のフォーム フィールドはユニバーサル セッション トラッキングをサポートしません。
各 URL の後に追加データを追加してセッションを区別することができ、サーバーはこのデータに基づいてセッション ID を関連付けることができます。
たとえば、http://w3cschool.cn/file.htm;sessionid=12345、セッション識別子は sessionid=12345 であり、サーバーはこのデータを使用してクライアントを識別できます。
これと比較すると、URL の書き換えはより良い方法であり、ブラウザが Cookie をサポートしていない場合でも機能しますが、欠点は、たとえそれが単純な HTML ページであっても、URL ごとにセッション ID を動的に指定する必要があることです。
上記のメソッドに加えて、JSP はサーブレットによって提供される HttpSession インターフェイスを使用してユーザーを識別し、このユーザーのすべてのアクセス情報を保存します。
デフォルトでは、JSP はセッション追跡を許可しており、新しいクライアントに対して新しい HttpSession オブジェクトが自動的にインスタンス化されます。セッション トラッキングを無効にするには、セッション トラッキングを明示的にオフにする必要があります。これを行うには、次のように、ページ ディレクティブのセッション属性の値を false に設定します。
<%@ ページセッション="false" %>
JSP エンジンは、基礎となるセッション オブジェクトを開発者に公開します。セッション オブジェクトが提供されるため、開発者はデータを簡単に保存または取得できます。
次の表に、セッション オブジェクトのいくつかの重要なメソッドを示します。
SN | 方法と説明 |
---|---|
1 | public Object getAttribute(String name) は、セッション オブジェクト内の指定された名前にバインドされたオブジェクトを返します。オブジェクトが存在しない場合は null を返します。 |
2 | public Enumeration getAttributeNames() は、セッション オブジェクト内のすべてのオブジェクト名を返します。 |
3 | public long getCreationTime() は、 1970 年 1 月 1 日の早朝から始まる、セッション オブジェクトが作成された時刻をミリ秒単位で返します。 |
4 | public String getId() はセッション オブジェクトの ID を返します。 |
5 | public long getLastAccessedTime() は、 1970 年 1 月 1 日の早朝から始まるクライアントの最終アクセス時刻をミリ秒単位で返します。 |
6 | public int getMaxInactiveInterval() は、サーブレット コンテナがセッションを開いたままにする最大時間間隔を秒単位で返します。 |
7 | public void validate() はセッションを無効にし、セッションにバインドされているオブジェクトをアンバインドします。 |
8 | public boolean isNew( は、新しいクライアントかどうか、またはクライアントがセッションへの参加を拒否したかどうかを返します。 |
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.*" %><% // セッションの作成時刻を取得します。 Date createTime = new Date(session.getCreationTime()); // セッションの作成時刻を取得します。最終ページ訪問日 lastAccessTime = new Date(session.getLastAccessedTime()); String title = "私の Web サイトへようこそ" Integer visitCount = new Integer(0); new String("visitCount"); String userIDKey = new String("userID"); String userID = new String("ABCD"); // 新しいユーザーが Web ページにアクセスしたかどうかを確認します if (session.isNew() ){ title = "私の Web サイトへようこそ"; session.setAttribute(userIDKey, userID); visitCount = (整数)session.getAttribute(visitCountKey); visitCount = visitCount + 1; userID = (String)session.getAttribute(userIDKey); %><html><head><title>セッション追跡</title></head><body><center><h1>セッショントラッキング</h1></center><table align="center"> <tr bgcolor="#949494"> <th>セッション情報</th> <th>値</th></tr> <tr> <td>id</td> <td><% out.print( session. getId()); %></td></tr> <tr> <td>作成時間</td> <td><% out.print(createTime); tr> <td>最終アクセス時刻</td> <td><% out.print(lastAccessTime) %></td></tr> <tr> <td>ユーザー ID</td> <td><% out.print(userID); %></td></tr> <tr> <td>訪問数</td> <td><% out.print(visitCount); tr> </table> </body></html>
http://localhost:8080/main.jsp にアクセスしてみます。初めて実行すると、次の結果が得られます。
再度アクセスすると、次の結果が得られます。
ユーザーのセッション データを処理した後、次のオプションがあります。
特定の属性を削除します。
public void RemoveAttribute(String name) メソッドを呼び出して、指定された属性を削除します。
セッション全体を削除します。
public void validate() メソッドを呼び出して、セッション全体を無効にします。
セッションの有効期間を設定します。
public void setMaxInactiveInterval(int interval) メソッドを呼び出して、セッション タイムアウトを設定します。
ログアウトユーザー:
サーブレット バージョン 2.4 をサポートするサーバーは、logout() メソッドを呼び出してユーザーをログアウトし、関連するすべてのセッションを無効にすることができます。
web.xml ファイルを構成します。
Tomcat を使用している場合は、web.xml ファイルを次のように構成できます。
<セッション構成> <セッションタイムアウト>15</セッションタイムアウト> </セッション構成>
タイムアウトは分単位で、Tomcat のデフォルトのタイムアウトは 30 分です。
サーブレットの getMaxInactiveInterval() メソッドはタイムアウトを秒単位で返します。 web.xml で 15 分が構成されている場合、getMaxInactiveInterval() メソッドは 900 を返します。