サーブレットのセッション・トラッキング
HTTPは、クライアントがページを取得するたびに、クライアントがWebサーバーへの個別の接続を開き、任意のクライアント要求が予約されている前に、サーバが自動的に記録されないことを意味し、「ステートレス」プロトコルです。
しかし、WebクライアントとWebサーバーの間のセッションの会話を維持するために、次の3つの方法がまだあります:
クッキー
ウェブサーバは、各Webクライアントクッキー用のセッションとして一意のセッションIDを割り当てることができ、クライアントのための後続の要求が受信されたクッキーを同定するために用いることができます。
多くのブラウザがCookieをサポートしていないので、これは、効果的な方法ではないかもしれないので、セッションのセッションを維持するために、この方法を使用することはお勧めしません。
隠しフォームフィールド
次のようにWebサーバーは、非表示のHTMLフォームフィールドだけでなく、ユニークなセッションのセッションIDを送信することができます。
<入力タイプ= "隠された"名前= "セッションID"値= "12345">
このエントリは、フォームが送信されると、指定された名前と値が自動的にGETまたはPOSTデータに含まれることを意味します。 Webブラウザが要求を返信するたびに、SESSION_ID値が異なるWebブラウザの追跡を維持するために使用することができます。
これは、セッションのセッショントラッキングを維持するための効果的な方法かもしれないが、従来のハイパーテキストリンク(<A HREF...>)をクリックすると、フォームの送信にはつながらないので、非表示のフォームフィールドは、通常のセッションのセッショントラッキングをサポートしていません。
URL書き換え
あなたは、セッションセッションセッションセッション識別子となりますセッション関連するサーバについてのセッションを保存されたデータを識別するために、URLの両端にあるいくつかの余分なデータを追加することができます。
例:http://w3cschool.cc/file.htm;セッションセッション識別子がセッションID = 12345のように装着されているセッションID = 12345、識別子はクライアントを識別するために、Webサーバーにアクセスすることができます。
URLの書き換えは、ブラウザがCookieをサポートしていないとき、それは非常にうまく動作することができますセッションセッションを維持するための良い方法ですが、その欠点は、動的場合でも、セッションページのセッションIDを割り当てるために各URLのために生成されます静的なHTMLページがあまりにも、となります非常に簡単です。
HttpSessionのオブジェクト
上記の3つの方法に加えて、サーブレットはまた、識別やクロス、複数のページ要求またはやり方を訪問ユーザーに関する情報を格納するためにユーザに提供するHttpSessionインタフェースを提供します。
ServletコンテナはHTTPクライアントとHTTPサーバ間のセッションの会話を作成するには、このインタフェースを使用しています。 セッションは、複数のページ要求または接続で、特定の期間を継続します。
次のように、HttpServletRequestのパブリックメソッドのgetSession()を呼び出すことによって、HttpSessionのオブジェクトを取得するために来ます。
HttpSessionのセッション=でrequest.getSession();
クライアントに任意のドキュメントの内容を送信することでrequest.getSession()を呼び出す前に、あなたが必要です。 ここではいくつかの重要な方法の概要は、オブジェクトが用意されていHttpSessionのです。
序号 | 方法 & 描述 |
---|---|
1 | public Object getAttribute(String name) 该方法返回在该 session 会话中具有指定名称的对象,如果没有指定名称的对象,则返回 null。 |
2 | public Enumeration getAttributeNames() 该方法返回 String 对象的枚举,String 对象包含所有绑定到该 session 会话的对象的名称。 |
3 | public long getCreationTime() 该方法返回该 session 会话被创建的时间,自格林尼治标准时间 1970 年 1 月 1 日午夜算起,以毫秒为单位。 |
4 | public String getId() 该方法返回一个包含分配给该 session 会话的唯一标识符的字符串。 |
5 | public long getLastAccessedTime() 该方法返回客户端最后一次发送与该 session 会话相关的请求的时间自格林尼治标准时间 1970 年 1 月 1 日午夜算起,以毫秒为单位。 |
6 | public int getMaxInactiveInterval() 该方法返回 Servlet 容器在客户端访问时保持 session 会话打开的最大时间间隔,以秒为单位。 |
7 | public void invalidate() 该方法指示该 session 会话无效,并解除绑定到它上面的任何对象。 |
8 | public boolean isNew() 如果客户端还不知道该 session 会话,或者如果客户选择不参入该 session 会话,则该方法返回 true。 |
9 | public void removeAttribute(String name) 该方法将从该 session 会话移除指定名称的对象。 |
10 | public void setAttribute(String name, Object value) 该方法使用指定的名称绑定一个对象到该 session 会话。 |
11 | public void setMaxInactiveInterval(int interval) 该方法在 Servlet 容器指示该 session 会话无效之前,指定客户端请求之间的时间,以秒为单位。 |
セッション・トラッキングの例
この例では、セッションセッションの作成時間と最終アクセス時刻を取得するためにHttpSessionオブジェクトを使用する方法を示しています。 何のセッションセッションが存在しない場合、我々は、セッション要求によって、新しいセッションを作成します。
package com.w3big.test; import java.io.IOException; import java.io.PrintWriter; import java.text.SimpleDateFormat; import java.util.Date; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; /** * Servlet implementation class SessionTrack */ @WebServlet("/SessionTrack") public class SessionTrack extends HttpServlet { private static final long serialVersionUID = 1L; 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()); //设置日期输出的格式 SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String title = "Servlet Session 实例 - 本教程"; Integer visitCount = new Integer(0); String visitCountKey = new String("visitCount"); String userIDKey = new String("userID"); String userID = new String("w3big"); // 检查网页上是否有新的访问者 if (session.isNew()){ title = "Servlet Session 实例 - 本教程"; 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;charset=UTF-8"); PrintWriter out = response.getWriter(); String docType = "<!DOCTYPE html>\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>创建时间</td>\n" + " <td>" + df.format(createTime) + " </td></tr>\n" + "<tr>\n" + " <td>最后访问时间</td>\n" + " <td>" + df.format(lastAccessTime) + " </td></tr>\n" + "<tr>\n" + " <td>用户 ID</td>\n" + " <td>" + userID + " </td></tr>\n" + "<tr>\n" + " <td>访问统计:</td>\n" + " <td>" + visitCount + "</td></tr>\n" + "</table>\n" + "</body></html>"); } }
以前のサーブレット SessionTrackをコンパイルし、web.xmlファイルに適切なエントリを作成します。
<?xml version="1.0" encoding="UTF-8"?> <web-app> <servlet> <!-- 类名 --> <servlet-name>SessionTrack</servlet-name> <!-- 所在的包 --> <servlet-class>com.w3big.test.SessionTrack</servlet-class> </servlet> <servlet-mapping> <servlet-name>SessionTrack</servlet-name> <!-- 访问的网址 --> <url-pattern>/TomcatTest/SessionTrack</url-pattern> </servlet-mapping> </web-app>
ブラウザのアドレスバーに入力します。http:// localhostを:8080 / TomcatTest / SessionTrack、あなたが最初のショーを実行すると、以下の結果:
それは次のような結果が表示され、再び同じサーブレットを実行してみてください:
セッションのセッションデータを削除します。
あなたは、セッションユーザーセッションデータが終了したら、次のオプションがあります。
- 特定の属性を削除してください:あなたはキーに関連付けられた特定の値を削除するには、 公共ボイドremoveAttribute(String name)メソッドを呼び出すことができます。
- セッション全体セッションを削除します。あなたは、セッション全体セッションを廃棄する公共ボイド無効()メソッドを呼び出すことができます。
- セッションは、セッションの有効期限を設定する:あなたは別のセッションのセッションタイムアウトを設定するには、 公共ボイドsetMaxInactiveInterval(int型の間隔)メソッドを呼び出すことができます。
- ログアウトユーザー:あなたがサポートされているサーブレット2.4サーバーを使用している場合は、Webサーバークライアントをログアウトするログアウトを呼び出すことができ、すべてのユーザーが無効なように、すべてのセッションのセッションに属します。
- web.xmlの設定:Tomcatを使用している場合は、次のように、上記の方法に加えて、あなたは、web.xmlファイル内のセッションセッションのタイムアウトを設定することができます。
<session-config> <session-timeout>15</session-timeout> </session-config>
上記アウト時間の例は数分で、Tomcatはデフォルトの30分のタイムアウトを上書きします。
()メソッド内のサーブレットでgetMaxInactiveIntervalは秒で、タイムアウトセッションセッションを返します。 だから、その後、15分のweb.xmlのセッション時間が設定されたセッションのタイムアウト場合getMaxInactiveInterval()は、900を返します。