English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Servlet セッション追跡

HTTPは「無状態」プロトコルであり、これはクライアントがウェブページを検索するたびに、クライアントがWebサーバーに個別の接続を開き、サーバーが前回のクライアントのリクエストの記録を自動的に保持しないことを意味します。

WebクライアントとWebサーバー間のsession会話を維持するためには以下の3つの方法があります:

Cookies

Webサーバーは、各Webクライアントに対してユニークなセッション会話IDを割り当て、クライアントの後続リクエストに使用するcookieを識別するために使用できます。

これは効果的でない方法かもしれません、なぜなら多くのブラウザがクッキーをサポートしていないため、セッション会話を維持するためにこの方法を使用することは推奨されません。

隠されたフォームフィールド

Webサーバーは、以下のようにユニークなセッション会話IDと隠されたHTMLフォームフィールドを送信できます:

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

このエントリは、フォームが送信された場合、指定された名前と値が自動的にGETまたはPOSTデータに含められることを意味しており、Webブラウザがリクエストを送信するたびに、session_idの値を使用して異なるWebブラウザのトラッキングを保持できます。

これはセッション会話トラッキングを維持する効果的な方法かもしれませんが、通常のテキストリンク(<A HREF...>)をクリックすると、フォームの送信は発生せず、隠されたフォームフィールドも通常のセッション会話トラッキングをサポートしていません。

URLリライト

URLの最後に追加データを追加することで、セッション会話を識別し、サーバーはセッション会話識別子と既に保存されているセッション会話データを関連付けることができます。

例えば、http://oldtoolbag.com/file.htm;sessionid=12345、セッション会話識別子は'sessionid='として付加されます。12345、識別子はWebサーバーによってアクセスされ、クライアントを識別するために使用されます。

URLリライトは、クッキーがサポートされていないブラウザで非常に良い結果を得られるセッション会話の維持方法ですが、欠点は、セッション会話IDを割り当てるために各URLを動的に生成する必要があるため、非常にシンプルな静的HTMLページであってもそうであることです。

HttpSessionオブジェクト

上記の3つの方法に加えて、ServletはHttpSessionインターフェースも提供しており、複数のページリクエストやサイト訪問時にユーザーを識別し、ユーザー情報を保存する方法を提供しています。

Servletコンテナは、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()
このメソッドは、このセッションセッションが作成された時間をグリニッジ標準時から返します。 1970 年 1 月 1 日曜日の真夜中から、ミリ秒単位で。
4public String getId()
このメソッドは、このセッションセッションに割り当てられたユニークな識別子を含む文字列を返します。
5public long getLastAccessedTime()
このメソッドは、クライアントがこのセッションセッションに関連するリクエストを最後に送信した時間をグリニッジ標準時から返します。 1970 年 1 月 1 日曜日の真夜中から、ミリ秒単位で。
6public int getMaxInactiveInterval()
このメソッドは、クライアントがアクセスしたときにServletコンテナがセッションセッションを開いて保持する最大時間間隔を秒単位で返します。
7セッション全体を削除する方法:
このメソッドは、このセッションセッションが無効であることを示し、それにバインドされているすべてのオブジェクトを解除します。
8public boolean isNew()
クライアントがこのセッションセッションをまだ知らない場合、またはクライアントがセッションセッションに参加しないことを選択した場合、このメソッドはtrueを返します。
9public void removeAttribute(String name)
このメソッドは、指定された名前のオブジェクトをこのセッションセッションから削除します。
10public void setAttribute(String name, Object value)
このメソッドは、指定された名前でオブジェクトをこのセッションセッションにバインドします。
11public void setMaxInactiveInterval(int interval)
このメソッドは、Servletコンテナがこのセッションセッションが無効であると指示する前に、クライアントリクエスト間の時間を秒単位で指定します。

Sessionトラッキングサンプル

このサンプルは、HttpSessionオブジェクトを使用してsessionセッションの作成時間および最終アクセス時間を取得する方法を説明します。sessionセッションが存在しない場合、リクエストを通じて新しいsessionセッションを作成します。

package com.w3codebox.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実装クラス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("w3codebox");
        if(session.getAttribute(visitCountKey) == null) {
            session.setAttribute(visitCountKey, new Integer(0));
        }
    
        // ウェブページ上に新しい訪問者がいるか確認
        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\">セッション情報</h2>\n" +
                "<table border=\"1\" align=\"center\">\n" +
                "<tr bgcolor=\"#949494\">\n" +
                "  <th>セッション情報</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>"); 
    }
}

上記のServletをコンパイルします SessionTrack、web.xmlファイルに適切なエントリを作成します。

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
  <servlet> 
    <!-- クラス名 -->  
    <servlet-name>SessionTrack</servlet-name>
    <!-- のパッケージ -->
    <servlet-class>com.w3codebox.test.SessionTrack</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>SessionTrack</servlet-name>
    <!-- 訪問したURL -->
    <url-pattern>/TomcatTest/SessionTrack</url-pattern>
  </servlet-mapping>
</web-app>

ブラウザのアドレスバーに入力します http://localhost:8080/TomcatTest/SessionTrack初めて実行した場合、以下のような結果が表示されます:

同じServletを再度実行すると、以下のような結果が表示されます:

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

ユーザーのセッションデータを完了した場合、以下のような選択肢があります:

  • 属性を特定のものを削除します:セッションの有効期限を設定するには、以下の public void removeAttribute(String name) 方法来删除与特定的键相关联的值。

  • メソッドを使用して特定のキーに関連付けられた値を削除する方法:セッションの有効期限を設定するには、以下の セッション全体を削除する方法: public void invalidate()

  • メソッドを使用します。セッションの有効期限を設定するには、以下の public void setMaxInactiveInterval(int interval) メソッドを使用してセッションのタイムアウトを個別に設定できます。

  • ユーザーをログアウトする:servletをサポートする 2.4 のサーバーでは、以下を呼び出すことができます。 logout すべてのユーザーのすべてのセッションを無効にして、Webサーバーのクライアントを注销するために使用されます。

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

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

上の例のタイムアウト時間は分単位で、Tomcatのデフォルトの 30 分のタイムアウト時間に設定すると

Servlet 内の getMaxInactiveInterval() メソッドはセッションのタイムアウト時間を秒単位で返します。したがって、web.xml でセッションのタイムアウト時間を 15 分、その場合 getMaxInactiveInterval() は 900。