HttpSessionの基本概要
HttpSessionはJavaWebにおけるセッション管理を行うためのクラスです。サーバー側に保存されるオブジェクトであり、クライアントごとの状態を保持するために利用されます。
Servletの3大ドメインオブジェクト(request、session、application(ServletContext))の1つとして、以下の属性操作メソッドを提供します:
- setAttribute(String key, Object val):属性をセットする
- Object getAttribute(String key):属性を取得する
- removeAttribute(String key):属性を削除する
内部的にはCookieまたはURL書き換えを用いてセッションIDを管理しています。
セッションの適用範囲と取得方法
セッションの範囲は、ユーザーが最初にサーバーへアクセスしてからブラウザを閉じるまでの一連の流れです。この期間中の複数リクエストは「連続したリクエスト」とみなされます。
サーバーは各クライアントごとにsessionオブジェクトを生成し、Map形式のセッションキャッシュで管理します。
コード内での取得例:
// Servlet内での取得
HttpSession userSession = request.getSession();
// JSPでは暗黙オブジェクトとして利用可能
// 記述不要で「session」を直接使用できる
セッション生成の内部処理
request.getSession()を呼び出すと、以下の処理が行われます:
- リクエスト内のCookieからJSESSIONIDを探す
- IDが存在しない場合:新規セッションを作成し、IDをCookieに保存して返す
- IDは存在するがセッションが見つからない場合:同様に新規作成
- IDに対応するセッションが存在する場合:既存のセッションを返す
新規作成されたセッションIDは、寿命が-1のCookieとしてブラウザメモリに保存され、ブラウザを閉じるまで維持されます。
なお、request.getSession(false)を使用すると、存在しない場合にnullを返し、新規作成は行われません。
主要メソッド一覧
String getId():現在のセッションIDを取得int getMaxInactiveInterval():非アクティブ状態で維持される最大時間(秒)。デフォルト30分void invalidate():セッションを無効化し、次回アクセス時に新しいセッションを生成させるboolean isNew():現在のセッションがまだクライアントへIDを返していない「新規状態」かを判定
web.xmlでのセッション有効期限設定
<session-config>
<session-timeout>30</session-timeout>
</session-config>
実践例①:異なるServlet間でのデータ共有
SessionSaveServletでデータを保存し、SessionReadServletでそれを読み取る例です。
// SessionSaveServlet内
protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
HttpSession session = req.getSession();
session.setAttribute("message", "セッションに保存されたデータ");
}
// SessionReadServlet内
protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
HttpSession session = req.getSession();
String msg = (String) session.getAttribute("message");
System.out.println(msg);
}
実践例②:ログイン状態の保持
login.jspから送信された情報をLoginCheckServletで検証し、ログイン成功時にセッションへユーザー情報を保存します。
// LoginCheckServlet内
protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
String userId = req.getParameter("userId");
String password = req.getParameter("password");
if ("admin".equals(userId) && "1234".equals(password)) {
HttpSession session = req.getSession();
session.setAttribute("loginUser", userId);
resp.sendRedirect("success.jsp");
} else {
req.setAttribute("error", "ログイン失敗");
req.getRequestDispatcher("login.jsp").forward(req, resp);
}
}
success.jspなどでは、以下のようにログイン状態を判定できます:
<%
String user = (String) session.getAttribute("loginUser");
if (user == null) {
%>
<p>未ログイン状態です。</p>
<%
} else {
%>
<p>ようこそ、<%= user %> さん</p>
<%
}
%>
ブラウザを閉じない限りセッションが維持されるため、保存されたユーザー情報も有効です。