セッション

セッションとは

ブラウザとサーバーの一連のやりとりのこと。
例えばあるwebサイトにアクセスして、そのサイトから出て行くかブラウザを閉じるまでが1セッションとなる。
セッション管理を用いると、ショッピングサイトなどで異なるページを開いても同一クライアントの情報を管理することができる。
多くの場合ページの閲覧時間が何分か開くと新しいセッションとしてカウントされる。サイトでよく見かける”セッションタイムアウトになりました”というのがこれを意味する。
HttpSessionインタフェースを使用するとサーブレットコンテナがセッション管理を容易に行ってくれる。

セッション管理サンプルコード

package example;

import java.io.IOException;
import java.io.PrintWriter;

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;

@WebServlet("/count")
public class CountServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        HttpSession session = req.getSession();
        Integer count = (Integer) session.getAttribute("count");
        if (count == null) {
            count = 0;
        }
        count++;
        session.setAttribute("count", count);

        resp.setContentType("text/html;charset=UTF-8");
        PrintWriter out = resp.getWriter();
        out.println("<html>");
        out.println("<head><title>Count</title></head>");
        out.println("<body>");
        out.println("<h1>Count: " + count + "</h1>");
        out.println("<a href=\"count\" >count</a>");
        out.println("</body>");
        out.println("</html>");
    }
}
HttpSession session = req.getSession();

doGetメソッドでは、HttpServletRequestオブジェクトに対してgetSessionメソッドを呼び出し、HttpSessionオブジェクトを取得している。
この時引数を指定していないので、初回アクセス時などセッションが存在していない場合は新しいセッションが作成される。

Integer count = (Integer) session.getAttribute("count");

HttpSessionオブジェクトのgetAttributeメソッドを呼び出し、"count"という名前で保存されたデータの値を取得している。この時データがなければnullで返却される。
また、getAttributeはオブジェクト型で返却され、基本データ型は扱えない。そのため今回はIntegerにキャストして変数countをint型として扱っている。

if (count == null) {
        count = 0;
}
count++;
session.setAttribute("count", count);

変数countがnullでないことを確認し、countをカウントアップしている。そしてその後HttpsSessionオブジェクトに対しsetAttributeメソッドを呼び出し、"count"という名前をつけcountオブジェクトをセッションに保存している。