サーブレットセッションの追跡


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

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

Cookie

Web サーバーは、各 Web クライアントに固有のセッション ID を Cookie として割り当てることができ、クライアントからの後続のリクエストは、受信した Cookie を使用して識別できます。

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

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

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

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

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

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

URL 書き換え

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

たとえば、http://w3cschool.cc/file.htm;sessionid=12345 では、セッションのセッション識別子が sessionid=12345 として追加され、Web サーバーがこの識別子にアクセスしてクライアントを識別できます。

URL の書き換えは、ブラウザが Cookie をサポートしていない場合にはうまく機能しますが、非常に単純な静的な HTML ページであっても、各 URL が動的に生成されてページにセッション ID が割り当てられるという点が欠点です。 。

HttpSession オブジェクト

上記の 3 つのメソッドに加えて、サーブレットは HttpSession インターフェースも提供します。これは、ユーザーを識別し、複数のページ要求間または Web サイトにアクセスするときにユーザーに関する情報を保存する方法を提供します。

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

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

HttpSession session = request.getSession();

ドキュメントのコンテンツをクライアントに送信する前に、request.getSession() を呼び出す必要があります。以下は、HttpSession オブジェクトで使用できるいくつかの重要なメソッドをまとめたものです:

シリアル番号メソッドと説明
1public Object getAttribute(String name)
このメソッドは、セッション内に指定された名前のオブジェクトが存在しない場合、指定された名前のオブジェクトを返します。の場合、null が返されます。
2public Enumeration getAttributeNames()
このメソッドは、このセッションにバインドされているすべてのオブジェクトの名前を含む String オブジェクトの列挙を返します。
3public long getCreationTime()
このメソッドは、このセッションが作成された時刻を、GMT 1970 年 1 月 1 日の午前 0 時からミリ秒単位で返します。
4public String getId()
このメソッドは、このセッションに割り当てられた一意の識別子を含む文字列を返します。
5public long getLastAccessedTime()
このメソッドは、グリニッジ標準時 1970 年 1 月 1 日午前 0 時以降、クライアントがこのセッションに関連するリクエストを最後に送信した時刻をミリ秒単位で返します。
6public int getMaxInactiveInterval()
このメソッドは、クライアントがアクセスしたときにサーブレット コンテナがセッションを開いたままにする最大時間間隔を秒単位で返します。
7public void validate()
このメソッドは、セッションが無効であることを示し、セッションにバインドされているすべてのオブジェクトをバインド解除します。
8public boolean isNew(
クライアントがセッションをまだ知らない場合、またはクライアントがセッションに参加しないことを選択した場合、このメソッドはtrueを返します。
9public void RemoveAttribute(String name)
このメソッドは、指定された名前のオブジェクトをセッションから削除します
10public void setAttribute(String name, Object value)
このメソッドは、指定されたオブジェクトをバインドします。
11 public void setMaxInactiveInterval(int interval)
このメソッドは、サーブレット コンテナがセッションが無効であることを示すまでの時間を秒単位で指定します。

セッション追跡の例

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

// 导入必需的 java 库
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
 
// 扩展 HttpServlet 类
public class SessionTrack extends HttpServlet {
 
  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
      // 如果不存在 session 会话,则创建一个 session 对象
      HttpSession session = request.getSession(true);
      // 获取 session 创建时间
      Date createTime = new Date(session.getCreationTime());
      // 获取该网页的最后一次访问时间
      Date lastAccessTime = 
                        new Date(session.getLastAccessedTime());

      String title = "欢迎回到我的网站";
      Integer visitCount = new Integer(0);
      String visitCountKey = new String("visitCount");
      String userIDKey = new String("userID");
      String userID = new String("ABCD");

      // 检查网页上是否有新的访问者
      if (session.isNew()){
         title = "欢迎来到我的网站";
         session.setAttribute(userIDKey, userID);
      } else {
         visitCount = (Integer)session.getAttribute(visitCountKey);
         visitCount = visitCount + 1;
         userID = (String)session.getAttribute(userIDKey);
      }
      session.setAttribute(visitCountKey,  visitCount);

      // 设置响应内容类型
      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 信息</h2>\n" +
                "<table border=\"1\" align=\"center\">\n" +
                "<tr bgcolor=\"#949494\">\n" +
                "  <th>Session 信息</th><th>值</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 と入力すると、初めて実行すると次の結果が表示されます:

私の Web サイトへようこそ

セッション情報

セッション情報
id0AE3EC93FF44E3C525B4351B77ABB2D5
作成時間火曜日 Jun 08 17:26:40 GMT+04:00 2014
最終アクセス時刻火曜日 6 月 08 日 17:26 : 40 GMT+04:00 2014
ユーザーIDABCD
訪問数0

同じサーブレットを再度実行してみると、次の結果が表示されます:

おかえりなさい 私のウェブサイトに移動します

セッション情報

L最終アクセス時間ユーザーID訪問数1
セッション情報value
id0AE3EC93FF44E3C525B4351B77ABB2D5
Cre時間火曜日 Jun 08 17:26:40 GMT+04:00 2014
tue Jun 08 17:26:40 GMT+04:00 2014
ABCD
1
🎜🎜

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

ユーザーのセッション データの削除が完了したら、次のオプションがあります:

  • 特定の属性を削除する: public void RemoveAttribute(String name ) メソッドを呼び出して、特定のキーに関連付けられた値を削除します。特定のキーに関連付けられた値を削除します。

  • セッション全体を削除する: public void validate() メソッドを呼び出して、セッション全体を破棄できます。

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

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

  • ユーザーをログアウトします:
  • サーブレット 2.4 をサポートするサーバーを使用している場合は、

    logout を呼び出して Web サーバーのクライアントをログアウトし、すべてのユーザーに属するすべてのセッションを無効にすることができます。

  • web.xml 設定:
  • Tomcat を使用している場合は、上記の方法に加えて、web.xml ファイルで次のようにセッション セッション タイムアウトを設定することもできます:

      <session-config>
        <session-timeout>15</session-timeout>
      </session-config>

    上記の Timeout例 時間は分単位であり、Tomcat のデフォルトの 30 分のタイムアウトを上書きします。
サーブレットの getMaxInactiveInterval() メソッドは、セッション タイムアウトを秒単位で返します。したがって、セッション タイムアウトが web.xml で 15 分に設定されている場合、getMaxInactiveInterval() は 900 を返します。