サーブレットセッションの追跡
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 オブジェクトで使用できるいくつかの重要なメソッドをまとめたものです:
シリアル番号 | メソッドと説明 | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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 validate() このメソッドは、セッションが無効であることを示し、セッションにバインドされているすべてのオブジェクトをバインド解除します。 | ||||||||||||||||||||||||
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 オブジェクトを使用してセッションの作成時刻と最終アクセス時刻を取得する方法を示します。セッションが存在しない場合は、リクエストを使用して新しいセッションを作成します。 // 导入必需的 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 サイトへようこそセッション情報
同じサーブレットを再度実行してみると、次の結果が表示されます: おかえりなさい 私のウェブサイトに移動しますセッション情報
セッション データを削除するユーザーのセッション データの削除が完了したら、次のオプションがあります:
|