JSPセッション


HTTP はステートレス プロトコルです。つまり、クライアントが Web ページを取得するたびに別のサーバー接続が開かれるため、サーバーは以前のクライアント要求からの情報を記録しません。

クライアントとサーバー間のセッションを維持するには 3 つの方法があります:


Cookie

Web サーバーは、各クライアントを表す一意のセッション ID を Cookie として割り当て、このクライアントからの後続のリクエストを識別できます。

多くの場合、ブラウザーは必ずしも Cookie をサポートしているわけではないため、これは効率的な方法ではない可能性があります。そのため、セッションを維持するためにこの方法を使用することはお勧めしません。


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

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

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

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

このアプローチは効率的な方法かもしれませんが、<A HREF> タグ内のハイパーリンクをクリックしてもフォーム送信イベントは生成されないため、非表示のフォーム フィールドはユニバーサル セッション トラッキングをサポートしません。


URL の書き換え

セッションを区別するために各 URL の後に追加データを追加することができ、サーバーはこのデータに基づいてセッション ID を関連付けることができます。

たとえば、http://w3cschool.cc/file.htm;sessionid=12345、セッション識別子は sessionid=12345 であり、サーバーはこのデータを使用してクライアントを識別できます。

それに比べて、URL を書き換える方が良い方法です。ブラウザが Cookie をサポートしていない場合でも機能しますが、欠点は、たとえそれが単純な HTML ページであっても、URL ごとにセッション ID を動的に指定する必要があることです。


セッション オブジェクト

上記のメソッドに加えて、JSP はサーブレットによって提供される HttpSession インターフェイスを使用してユーザーを識別し、このユーザーのすべてのアクセス情報を保存します。

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

<%@ page session="false" %>

JSP エンジンは、暗黙的なセッション オブジェクトを開発者に公開します。セッション オブジェクトが提供されるため、開発者はデータを簡単に保存または取得できます。

次の表は、セッション オブジェクトのいくつかの重要なメソッドをリストしたものです:

S.N.Method & Description
1public Object getAttribute(文字列名)


セッション オブジェクト内の指定された名前にバインドされたオブジェクトを返します。オブジェクトが存在しない場合は null を返します
2パブリック列挙体getAttributeNames()


セッションオブジェクト内のすべてのオブジェクト名を返します
3public long getCreationTime()


1970 年 1 月 1 日の早朝からセッション オブジェクトが作成された時刻をミリ秒単位で返します
4public String getId()


セッションオブジェクトのIDを返します
5public long getLastAccessedTime()


1970 年 1 月 1 日の早朝から始まるクライアントの最終アクセス時刻をミリ秒単位で返します
6public int getMaxInactiveInterval()


サーブレットコンテナがセッションを開いたままにする最大時間間隔を秒単位で返します
7public void validate()


セッションを無効にし、セッションにバインドされているオブジェクトのバインドを解除します
8public boolean isNew(


新しいクライアントかどうか、またはクライアントがセッションへの参加を拒否したかどうかを返します
9public void RemoveAttribute(文字列名)


セッション内の指定された名前のオブジェクトを削除します
10public void setAttribute(文字列名, オブジェクト値)


指定した名前と値を使用してオブジェクトを生成し、セッションにバインドします
11public void setMaxInactiveInterval(int 間隔)


サーブレットコンテナがセッションを有効に保つ時間を秒単位で指定するために使用されます

JSP セッション アプリケーション

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

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.io.*,java.util.*" %>
<%
   // 获取session创建时间
   Date createTime = new Date(session.getCreationTime());
   // 获取最后访问页面的时间
   Date lastAccessTime = new Date(session.getLastAccessedTime());

   String title = "再次访问php中文网实例";
   Integer visitCount = new Integer(0);
   String visitCountKey = new String("visitCount");
   String userIDKey = new String("userID");
   String userID = new String("ABCD");

   // 检测网页是否由新的访问用户
   if (session.isNew()){
      title = "访问php中文网实例";
      session.setAttribute(userIDKey, userID);
      session.setAttribute(visitCountKey,  visitCount);
   } else {
	   visitCount = (Integer)session.getAttribute(visitCountKey);
	   visitCount += 1;
	   userID = (String)session.getAttribute(userIDKey);
	   session.setAttribute(visitCountKey,  visitCount);
   }
%>
<html>
<head>
<title>Session 跟踪</title>
</head>
<body>

<h1>Session 跟踪</h1>

<table border="1" align="center"> 
<tr bgcolor="#949494">
   <th>Session 信息</th>
   <th>值</th>
</tr> 
<tr>
   <td>id</td>
   <td><% out.print( session.getId()); %></td>
</tr> 
<tr>
   <td>创建时间</td>
   <td><% out.print(createTime); %></td>
</tr> 
<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); %></td>
</tr> 
</table> 
</body>
</html>

http://localhost:8080/testjsp/main.jsp にアクセスしてみます。初めて実行すると、次の結果が得られます:

sessjsp1.jpg

もう一度アクセスすると、次の結果が得られます。結果:

sessjsp2.jpg


セッション データを削除する

ユーザーのセッション データを処理した後、次のオプションを使用できます:

  • 特定の属性を削除する:

    public void RemoveAttribute(String name) メソッドを呼び出して、指定された属性を削除します。

  • セッション全体を削除します:

    public void validate() メソッドを呼び出して、セッション全体を無効にします。

  • セッションの有効期間を設定します。

    public void setMaxInactiveInterval(int interval) メソッドを呼び出して、セッション タイムアウトを設定します。

  • ユーザーのログアウト:

    servlet2.4 バージョンをサポートするサーバーは、logout() メソッドを呼び出してユーザーをログアウトし、関連するすべてのセッションを無効にすることができます。

  • web.xml ファイルを構成します:

    Tomcat を使用している場合は、web.xml ファイルを次のように構成できます:

  •   <session-config>
        <session-timeout>15</session-timeout>
      </session-config>
タイムアウトは分単位です。Tomcat のデフォルトのタイムアウトは 30 分です。

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