4.1 HttpSession の概要

複数のリクエストが同じクライアントから送信された場合、クライアントとサーバーの間にセッションが確立されたと見なされます。このプロセスを制御するために、コンテナーには特別な HttpSession オブジェクトがあります。

クライアントがサーブレットにリクエストを行うと、サーブレット コンテナはリクエストにセッション ID パラメータが存在するかどうかを確認します。そのようなパラメーターがない場合 (たとえば、クライアントが初めてサーバーに接続する場合)、サーブレット コンテナーは新しい HttpSession オブジェクトを作成し、それに一意の ID を割り当てます。

セッション オブジェクトはサーバーに保存され、ID は応答としてクライアントに送信され、デフォルトではクライアントの Cookie に保存されます。次に、同じクライアントから新しいリクエストが届くと、サーブレット コンテナはそのリクエストから ID を取得し、その ID によってサーバー上の正しい HttpSession オブジェクトを見つけます。

セッション オブジェクトはリクエスト (HttpServletRequest オブジェクト) から取得できます。このオブジェクトに対して getSession() メソッドを呼び出す必要があります。HttpSession オブジェクトを返します。

なぜセッションが必要なのでしょうか? 呼び出しの間にクライアントに関する情報を保存できます。彼女は内部に HashMap のようなものを持っており、キーごとにオブジェクトを保存できます。そのためのいくつかの方法:

メソッド 説明
1 setAttribute(String name, Object o) オブジェクトをセッションに追加します
2 getAttribute(String name) セッションからオブジェクトを取得します
3 removeAttribute(String name) セッションからオブジェクトを削除します

さまざまなリクエストから渡されたすべての数値を合計するサーブレットを作成しましょう。

public class CalculatorServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
         // Get the "sum" attribute from the session
        HttpSession session = request.getSession();
        Integer sum = (Integer) session.getAttribute("sum");
        //Handling the situation when the session does not yet have such an attribute
        if (sum == null)
            sum = 0;

         // Get the "n" parameter from the request
        String n = request.getParameter("n");
        sum += Integer.parseInt(n);

         // Write the "sum" attribute to the session
        session.setAttribute("sum", sum);

        // Print the HTML as a response to the browser
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head> <title> CalculatorServlet </title> </head>");
        out.println("<body>");
        out.println("<h1> Sum == " + sum + "</h1>");
        out.println("</body>");
        out.println("</html>");
    }
}

4.2 HttpSession の詳細

HttpSession オブジェクトについて他に述べていないことはありますか?

まず、J SESSION IDという名前です。その下のセッション ID が Cookie に保存されます。ご覧のとおり、覚えるのは非常に簡単ですJ+SESSION+ID

次に、セッションにはさらに便利なメソッドがいくつかあります。

メソッド 説明
1 getAttributeNames() セッションに保存されているすべてのキーのリストを返します。
2 getId() セッションID(文字列)を返します。
3 isNew() 現在のリクエストでセッションオブジェクトが作成された場合は true を返します。
4 setMaxInactiveInterval(int seconds) セッションの非アクティブ間隔を秒単位で設定します。
5 invalidate() セッションからすべてのオブジェクトを削除します

ここですべての方法は明らかですが、setMaxInactiveInterval()もう少し詳しく説明します。

サーバーに、先月アクセスしたクライアントのデータを含む数万のセッションが保存されている場合、単純にメモリ不足になります。したがって、「セッションの有効期間」を設定する方法があります。

一定期間誰もセッションを使用しなかった場合、セッションは自動的にクリアされ、保存されていたすべてのオブジェクトがセッションから削除されます。これはメモリを節約するために行われます。

デフォルトでは、この間隔は 1800 秒 == 30 分です。値を -1 に設定すると、セッションは「永久」となり、ユーザーがブラウザのタブを閉じたとき (つまり、クライアントが切断したとき) にのみ削除されます。

例:

// get all keys
Enumeration keys = session.getAttributeNames();
while( keys.hasMoreElements() ){
    System.out.println( (String) keys.nextElement() );
}
// set the inactivity interval
session.setMaxInactiveInterval(60*60*24);   // 1 day
session.setMaxInactiveInterval(-1); // until the browser is closed
// remove all data from the session
session.invalidate();