Java ServletのHttpSession setAttributeメソッドを完全解説!初心者でもわかるセッションへの値の保存方法
生徒
「Java Servletでログインした利用者の名前を、別の画面でも使いたいのですが、どうすればいいですか?」
先生
「そのような場合は、HttpSessionのsetAttributeメソッドを使って、利用者名などのデータをセッションへ保存できます。」
生徒
「文字列だけではなく、会員情報などのオブジェクトも保存できますか?」
先生
「できます。文字列だけでなく、数値や独自クラスのオブジェクトなども保存できます。それでは、HttpSessionとsetAttributeの基本から順番に見ていきましょう。」
1. HttpSessionとは何かを初心者向けに理解しよう
Java ServletでWebアプリケーションを作成するとき、ある画面で扱った情報を次の画面でも利用したいことがあります。例えばログインした利用者の名前、会員情報、ショッピングカートの商品、入力途中の情報などです。
このような利用者ごとの情報を複数のリクエストにまたがって保持するために利用されるのがHttpSessionです。Servletでは、ブラウザから送信されるリクエストごとに処理が行われます。そのため、前のリクエストで使った値を何もしなくても次のリクエストで利用できるわけではありません。
HttpSessionを利用すると、同じ利用者について一定期間データを保持できます。ログイン後に利用者情報をセッションへ保存しておけば、商品一覧画面、会員情報画面、注文画面など別のServletへ移動しても利用者情報を取得できます。
HttpSessionは、Java Servletでログイン状態、利用者情報、ショッピングカートなどを複数のリクエストにまたがって共有するときに利用される重要な仕組みです。
古いJava EEのServletではjavax.servlet.http.HttpSessionが使われていました。現在のJakarta Servletではjakarta.servlet.http.HttpSessionが使われています。基本的なセッション管理の考え方は共通していますが、現在のServlet環境で開発するときは使用しているAPIのパッケージ名にも注意しましょう。
2. setAttributeメソッドとは何をするメソッドなのか
setAttributeは、HttpSessionへ名前を付けてオブジェクトを保存するためのメソッドです。Java Servletでセッションに情報を保存するときの基本的なメソッドとして利用されます。
setAttributeでは、属性名と保存する値の二つを指定します。属性名は、あとで保存した値を取り出すための名前です。例えば利用者名をuserNameという属性名で保存しておけば、別のServletからuserNameという名前を指定して値を取得できます。
HttpSession session = request.getSession();
session.setAttribute("userName", "山田太郎");
この例では、まずリクエストからHttpSessionを取得しています。そのあとsetAttributeを使って、userNameという属性名で山田太郎という文字列をセッションへ保存しています。
Servlet初心者は、セッションを利用者専用の収納場所として考えると分かりやすいでしょう。setAttributeで収納する箱に名前を付けてデータを入れ、必要になったときにその名前を使って取り出すというイメージです。
setAttributeは値を画面へ直接表示するメソッドではありません。あくまでHttpSessionへデータを保存するためのメソッドです。保存した値を後から取り出すときにはgetAttributeを利用します。
3. setAttributeの属性名と値の仕組みを理解しよう
HttpSessionのsetAttributeを使ううえで重要なのが、属性名と値の関係です。属性名は文字列として指定し、その名前に対応する値をセッションへ保存します。
例えば、利用者名をuserName、利用者IDをuserIdという属性名で保存できます。同じセッションには複数の属性を保存できるため、必要な情報ごとに分かりやすい属性名を付けることが大切です。
HttpSession session = request.getSession();
session.setAttribute("userName", "佐藤花子");
session.setAttribute("userId", 100);
session.setAttribute("loginStatus", true);
この例では、利用者名、利用者ID、ログイン状態という三つの情報を同じセッションへ保存しています。属性名が異なっていれば、それぞれ別のデータとして管理できます。
属性名は後からgetAttributeで値を取得するときにも利用するため、意味が分かりやすい名前にすることが重要です。例えばnameだけでは何の名前なのか判断しにくい場合がありますが、userNameやproductNameのように目的が分かる名前にするとコードを読みやすくできます。
また、Javaでは大文字と小文字が区別されます。userNameという属性名で保存した値をusernameという別の名前で取得しようとしても同じ属性にはなりません。セッションから値を取得できない場合は、保存時と取得時の属性名が完全に一致しているか確認しましょう。
4. setAttributeで保存した値をgetAttributeで取得する方法
setAttributeでHttpSessionへ保存した値は、getAttributeメソッドを使って取得します。保存時に指定した属性名と同じ名前を指定することが基本です。
HttpSession session = request.getSession();
session.setAttribute("userName", "山田太郎");
String userName =
(String) session.getAttribute("userName");
response.getWriter().println(userName);
この例では、最初にuserNameという属性名で文字列を保存し、そのあと同じuserNameを指定して値を取り出しています。
getAttributeの戻り値はObject型です。HttpSessionには文字列だけではなく、整数、会員情報、商品情報、ショッピングカートなどさまざまなオブジェクトを保存できるためです。そのため、取得した値を実際に利用するときには、保存したデータの型に合わせて型変換を行う場合があります。
指定した属性名に対応する値が存在しない場合はnullが返されます。値を利用する前にnullかどうかを確認することで、NullPointerExceptionなどのエラーを防ぎやすくなります。
セッション属性の基本的な流れ
現在のServletではsetAttributeで値を保存し、getAttributeで値を取得するという組み合わせを基本として覚えましょう。
5. 独自クラスのオブジェクトをセッションへ保存する方法
HttpSessionのsetAttributeには文字列だけでなく、Javaの独自クラスから作成したオブジェクトも保存できます。実際のServlet開発では、ログインした利用者の情報をUserオブジェクトとしてセッションへ保存する方法がよく使われます。
例えばログイン処理でデータベースから取得した会員情報をUserオブジェクトとして保持している場合、そのオブジェクトをそのままセッション属性として保存できます。
HttpSession session = request.getSession();
User loginUser = new User();
loginUser.setId(1);
loginUser.setName("鈴木一郎");
session.setAttribute("loginUser", loginUser);
この例では、UserオブジェクトをloginUserという属性名でHttpSessionへ保存しています。別のServletではloginUserという名前で値を取得し、User型へ変換することで会員IDや会員名などを利用できます。
HttpSession session = request.getSession(false);
if (session != null) {
User loginUser =
(User) session.getAttribute("loginUser");
if (loginUser != null) {
response.getWriter().println(loginUser.getName());
}
}
このようにHttpSessionへオブジェクトを保存しておけば、複数のServletでログイン利用者の情報を共有できます。ログイン状態の確認や会員ページの表示など、Java Servletを使ったWebアプリケーションで活用しやすい方法です。
ただし、何でもセッションへ大量に保存すればよいわけではありません。セッションの情報は一定期間保持されるため、必要な情報を選んで保存することが大切です。大きなオブジェクトや不要なデータを大量に保存すると、サーバー側の負担が増える原因になる場合があります。
6. 同じ属性名でsetAttributeを呼び出すとどうなるのか
HttpSessionへすでに保存されている属性名を使って、もう一度setAttributeを呼び出すとどうなるのかも覚えておきましょう。
同じ属性名がすでに存在している場合、新しく指定した値によって既存の値が置き換えられます。そのため、setAttributeは新しい属性を追加するときだけでなく、既存のセッション属性を更新するときにも利用できます。
HttpSession session = request.getSession();
session.setAttribute("userName", "山田太郎");
session.setAttribute("userName", "山田花子");
String userName =
(String) session.getAttribute("userName");
この場合、userNameという同じ属性名に二回値を設定しているため、あとから設定した値が保存されます。
例えばショッピングカートの内容を更新したり、ログイン利用者の表示設定を変更したりする場合にも、同じ属性名を使って新しい値を設定できます。
一方で、誤って同じ属性名を利用すると、本来残しておきたかった値を上書きしてしまう可能性があります。複数のServletでセッション属性を扱う場合は、どの属性名がどこで使われているかを把握しておくことが大切です。
setAttributeで注意するポイント
- 同じ属性名を指定すると既存の値が置き換えられる
- 属性名は意味が分かる名前にする
- 大文字と小文字の違いに注意する
- 必要以上に大量のデータを保存しない
7. requestのsetAttributeとの違いを理解しよう
Java Servletを学習すると、HttpSessionだけでなくrequestにもsetAttributeがあることに気付く場合があります。同じメソッド名なので初心者には分かりにくいですが、大きな違いはデータを利用できる範囲です。
requestのsetAttributeで保存した値は、基本的に一回のリクエスト処理の中で利用します。ServletからJSPへフォワードするときに検索結果やメッセージを渡す場合などに向いています。
一方、HttpSessionのsetAttributeで保存した値は、同じ利用者の複数のリクエストにまたがって利用できます。そのため、ログイン利用者の情報やショッピングカートのように、複数の画面で継続して使う情報に向いています。
| 保存先 | 主な利用範囲 | 向いているデータ |
|---|---|---|
| request | 一回のリクエスト | 検索結果、入力エラー、画面表示用メッセージなど |
| session | 同じ利用者の複数のリクエスト | ログイン利用者、ショッピングカートなど |
何でもHttpSessionへ保存するのではなく、次のリクエストでも必要な情報なのかを考えることが重要です。一画面だけで使う値ならrequest、複数の画面で継続して使う値ならsessionという考え方から使い分けると理解しやすくなります。
8. removeAttributeやinvalidateとの違いを理解しよう
setAttributeでHttpSessionへ保存した値は、必要がなくなったときに削除することもできます。一つの属性だけを削除したい場合にはremoveAttributeを利用します。
例えば一時的に保存していた情報だけを削除したい場合は、その属性名を指定して削除できます。一方、ログアウト処理などでセッション全体を終了したい場合にはinvalidateを利用します。
HttpSession session = request.getSession(false);
if (session != null) {
session.removeAttribute("cart");
session.invalidate();
}
removeAttributeは特定のセッション属性だけを削除するためのメソッドです。invalidateはセッションそのものを無効にするため、保存されていたセッション情報を引き続き使うことはできません。
ログアウト処理では、ログイン利用者の情報だけを削除する設計も考えられますが、セッション全体を終了する目的でinvalidateを利用することがあります。どの情報をどのタイミングまで保持するのかを考えてセッション管理を行うことが大切です。
無効になったセッションへsetAttributeなどの操作を行うと、IllegalStateExceptionが発生する場合があります。セッションを無効化したあとに同じHttpSessionを再利用しないよう注意しましょう。
9. setAttributeで値が保存できないときの確認ポイント
Java ServletでsetAttributeを使っているのに、別の画面で値を取得できない場合は、いくつかの項目を順番に確認すると原因を見つけやすくなります。
最初に確認したいのは、HttpSessionに対してsetAttributeを呼び出しているかという点です。requestにもsetAttributeがあるため、一回のリクエストだけで使うrequest属性として保存しているのか、複数のリクエストで利用するsession属性として保存しているのかを確認しましょう。
次に確認したいのが属性名です。保存するときにloginUserという名前を使ったのであれば、取得するときにも同じloginUserを指定します。文字の違いや大文字と小文字の違いがあると、目的の属性を取得できません。
また、値を取得する前にセッションが無効になっていないかも確認します。ログアウト処理などでinvalidateが呼び出されている場合、それまで保存したセッション属性をそのまま利用することはできません。
setAttributeで確認したいポイント
- HttpSessionを正しく取得しているか
- sessionに対してsetAttributeを呼び出しているか
- 保存時と取得時の属性名が一致しているか
- 属性名の大文字と小文字を間違えていないか
- 同じ属性名を別の処理で上書きしていないか
- セッションが無効化されていないか
- 取得したオブジェクトを適切な型へ変換しているか
- 一回のリクエストだけならrequest属性のほうが適切ではないか
Servletのセッション処理でトラブルが発生したときは、セッションを取得した場所、setAttributeを呼び出した場所、属性名、getAttributeで取得している場所という順番で処理を追いかけると分かりやすくなります。
HttpSessionのsetAttributeは、ログイン機能、会員情報の保持、ショッピングカート、複数画面にまたがるデータ管理など、Java ServletのWebアプリケーションで頻繁に利用される基本的なメソッドです。
初心者は、まずrequestからHttpSessionを取得し、setAttributeで名前と値を保存し、別の処理でgetAttributeを使って取得するという基本の流れを覚えましょう。そのあとに、同じ属性名による上書き、removeAttributeによる削除、invalidateによるセッション無効化、request属性との違いを理解すると、Servletのセッション管理を体系的に学べます。
セッションは便利ですが、複数画面で必要だからという理由だけで多くの情報を無制限に保存するのではなく、本当に継続して必要なデータなのかを考えることも重要です。画面表示のためだけの一時的な値はrequestへ、ログイン状態のように複数のリクエストで必要な値はsessionへ保存するという使い分けを意識すると、分かりやすいWebアプリケーションを作りやすくなります。
まとめ
Java ServletでWebアプリケーションを作るとき、ログイン中の利用者情報やショッピングカートの内容などを複数の画面で共有したい場合があります。そのような利用者ごとの情報を保持するために使われるのがHttpSessionです。HttpSessionを利用すると、一回のリクエストだけではなく、同じ利用者から送信される複数のリクエストにまたがって情報を利用できます。
HttpSessionへ情報を保存するときに基本となるのがsetAttributeメソッドです。setAttributeでは、属性名と保存する値を指定します。属性名はあとから保存したデータを取り出すための名前であり、値には文字列だけでなく、数値、真偽値、会員情報を表すオブジェクト、商品情報、ショッピングカートなどさまざまなデータを指定できます。
Servlet初心者は、HttpSessionを利用者専用の収納場所として考えると理解しやすくなります。setAttributeで収納場所に名前を付けてデータを保存し、必要になったときにgetAttributeで同じ名前を指定して取り出すという流れです。Java Servletのセッション管理では、このsetAttributeとgetAttributeの組み合わせが基本になります。
setAttributeでは属性名と値をセットで保存する
HttpSessionのsetAttributeを使うときは、どの名前でどの値を保存するのかを意識することが大切です。例えばログインした利用者の名前を保存するのであればuserName、利用者情報全体を保存するのであればloginUserなど、何のデータなのか分かりやすい属性名を付けるとコードを読みやすくできます。
HttpSession session = request.getSession();
session.setAttribute("userName", "山田太郎");
session.setAttribute("userId", 100);
session.setAttribute("loginStatus", true);
この例では、同じHttpSessionへ利用者名、利用者ID、ログイン状態という三つの属性を保存しています。属性名が異なっていれば、それぞれ別の情報として管理できます。
属性名は自由に決められますが、保存するときと取得するときで同じ名前を使わなければなりません。Javaでは大文字と小文字が区別されるため、userNameとusernameは別の属性名になります。セッションへ保存したはずの値が取得できない場合は、まず属性名が完全に一致しているか確認するとよいでしょう。
保存した値はgetAttributeで取得する
setAttributeでセッションへ保存したデータは、getAttributeを使って取得します。保存時に指定した属性名をそのまま指定することがポイントです。
HttpSession session = request.getSession();
session.setAttribute("userName", "山田太郎");
String userName =
(String) session.getAttribute("userName");
response.getWriter().println(userName);
getAttributeの戻り値はObject型です。これはHttpSessionにさまざまな種類のオブジェクトを保存できるようになっているためです。そのため、取得したデータを文字列として利用する場合はString型、会員情報として利用する場合はUser型というように、保存したデータに合わせた型へ変換します。
また、指定した属性名に対応する値がセッションへ保存されていない場合はnullが返されます。取得した値をすぐに利用するのではなく、必要に応じてnullを確認することで、Java Servletで発生しやすいNullPointerExceptionなどのトラブルを防ぎやすくなります。
HttpSessionの基本的な流れ
- requestからHttpSessionを取得する
- setAttributeで属性名と値を保存する
- 別のServletでも同じセッションを利用する
- getAttributeで属性名を指定して値を取得する
- 取得した値を必要な型へ変換して利用する
ログイン情報などのオブジェクトも保存できる
setAttributeで保存できるのは文字列だけではありません。実際のJava ServletによるWebアプリケーションでは、ログインした利用者の情報をまとめたUserオブジェクトをHttpSessionへ保存する方法もよく使われます。
HttpSession session = request.getSession();
User loginUser = new User();
loginUser.setId(1);
loginUser.setName("鈴木一郎");
session.setAttribute("loginUser", loginUser);
UserオブジェクトをloginUserという属性名で保存しておけば、別のServletでも同じ属性名からログイン利用者を取得できます。そのため、会員情報画面、商品購入画面、注文確認画面など複数の画面で同じ利用者情報を共有できます。
HttpSession session = request.getSession(false);
if (session != null) {
User loginUser =
(User) session.getAttribute("loginUser");
if (loginUser != null) {
response.getWriter().println(loginUser.getName());
}
}
このように、HttpSessionへ保存した独自クラスのオブジェクトもgetAttributeで取得できます。ただし、セッションが存在しない場合や属性が保存されていない場合も考えられるため、ログイン確認などではセッションと属性の両方を確認することが大切です。
同じ属性名で保存すると値が置き換わる
setAttributeでは、すでに存在している属性名をもう一度指定すると、以前の値が新しい値に置き換えられます。そのため、新しいセッション属性を追加するだけでなく、すでに保存している情報を更新する目的でも利用できます。
HttpSession session = request.getSession();
session.setAttribute("userName", "山田太郎");
session.setAttribute("userName", "山田花子");
この場合、同じuserNameという属性名を利用しているため、後から設定した値が保存されます。利用者情報やショッピングカートの内容を更新したい場合には便利ですが、意図しない属性名の重複によって必要な値を上書きしてしまうこともあります。
複数のServletで同じHttpSessionを利用する場合は、どの属性名をどの処理で利用しているのか分かりやすくしておきましょう。属性名を意味のある名前にすることは、セッション管理のトラブルを減らすためにも役立ちます。
requestのsetAttributeとの違いも重要
ServletにはHttpSessionだけでなくrequestにもsetAttributeがあります。同じ名前のメソッドですが、データを利用できる範囲が異なります。
requestへ保存した属性は、基本的に一回のリクエスト処理の中で利用します。ServletからJSPへフォワードするときに検索結果や入力エラーメッセージを渡す場合などに向いています。一方、HttpSessionへ保存した属性は、同じ利用者の複数のリクエストで利用できます。
| 保存先 | 利用する範囲 | 主な用途 |
|---|---|---|
| request | 一回のリクエスト | 検索結果、入力エラー、画面表示用メッセージ |
| session | 複数のリクエスト | ログイン利用者、会員情報、ショッピングカート |
一回の画面表示だけで必要な情報までHttpSessionへ保存すると、必要以上に長くデータが残ることがあります。そのため、次のリクエストでも継続して必要なデータなのかを考えてrequestとsessionを使い分けることが重要です。
不要になったセッション属性は削除できる
setAttributeで保存した属性は、必要がなくなった場合にremoveAttributeを使って個別に削除できます。また、ログアウトなどでセッション全体を終了したい場合はinvalidateを利用できます。
HttpSession session = request.getSession(false);
if (session != null) {
session.removeAttribute("cart");
}
removeAttributeでは、指定した属性だけを削除できます。例えばショッピングカートだけを空にしたい場合など、ほかのセッション情報は残したまま一つの属性を削除したいときに利用できます。
HttpSession session = request.getSession(false);
if (session != null) {
session.invalidate();
}
invalidateはセッションそのものを無効にします。ログアウト処理などで利用されることがあり、無効化されたセッションに保存されていた情報をそのまま利用することはできません。また、無効化したHttpSessionに対してsetAttributeなどの操作を行うと、IllegalStateExceptionが発生する場合があります。
セッションには必要なデータだけを保存する
HttpSessionは複数のリクエストで情報を共有できるため便利ですが、何でも保存すればよいわけではありません。セッション属性は一定期間保持されるため、大きなオブジェクトや大量のデータを利用者ごとに保存すると、サーバー側の負担が増える原因になる場合があります。
ログイン利用者を識別するために必要な情報や、ショッピングカートのように複数画面で継続して利用する情報など、本当に必要なデータを選んで保存することが大切です。一時的な画面表示だけに利用する値であれば、request属性を使う方法も検討しましょう。
setAttributeを使うときに確認したいポイント
- HttpSessionを正しく取得しているか
- sessionに対してsetAttributeを呼び出しているか
- 属性名が分かりやすくなっているか
- 保存時と取得時で同じ属性名を利用しているか
- 大文字と小文字を間違えていないか
- 同じ属性名で意図せず上書きしていないか
- 不要なデータを大量にセッションへ保存していないか
- セッションが無効化されたあとに利用していないか
- 一回のリクエストだけならrequest属性を使うべきではないか
Java ServletでsetAttributeを使っているのに値が取得できない場合は、セッションを取得した場所、値を保存した場所、属性名、値を取得している場所という順番で処理を追いかけてみましょう。さらに、ログアウトなどでセッションが無効になっていないか、別の処理で同じ属性名が上書きされていないかも確認すると原因を見つけやすくなります。
HttpSessionのsetAttributeは、Servletのセッション管理を理解するうえで非常に基本的なメソッドです。setAttributeによる保存、getAttributeによる取得、removeAttributeによる個別削除、invalidateによるセッション全体の無効化という流れを関連付けて覚えると、ログイン機能やショッピングカートなどの処理を理解しやすくなります。
Servlet初心者は、まず利用者名などの簡単な文字列をsetAttributeで保存し、別の処理でgetAttributeを使って取得する練習から始めるとよいでしょう。その後、Userオブジェクトなどの独自クラス、request属性との違い、属性の上書き、ログアウト時のセッション無効化へ進むことで、Java ServletにおけるHttpSessionの使い方を段階的に理解できます。
生徒
「setAttributeは、HttpSessionに名前を付けて値を保存するためのメソッドなんですね。」
先生
「その通りです。例えばuserNameという属性名で利用者名を保存しておけば、別のServletでも同じ名前を使って取り出せます。」
生徒
「保存した値を取り出すときはgetAttributeを使うんですよね。」
先生
「はい。現在のServletでは、setAttributeで保存してgetAttributeで取得するという組み合わせを基本として覚えておきましょう。」
生徒
「文字列だけではなく、ログイン利用者を表すUserオブジェクトもそのまま保存できることが分かりました。」
先生
「そうです。複数のServletで利用者情報を共有したい場合に便利です。ただし、必要以上に大きなデータをセッションへ保存しないことも意識しましょう。」
生徒
「同じ属性名でもう一度setAttributeを使うと、前の値が新しい値に置き換わるんですね。」
先生
「はい。更新したい場合には便利ですが、属性名を間違えて既存のデータを上書きしないように注意が必要です。」
生徒
「requestにもsetAttributeがありますが、保存できる期間が違うと考えればいいですか?」
先生
「その考え方で分かりやすいです。一回のリクエストで使う情報ならrequest、ログイン情報のように複数のリクエストで使う情報ならsessionを検討します。」
生徒
「不要になった属性はremoveAttributeで消して、ログアウトするときなどはinvalidateでセッション全体を無効にできるんですね。」
先生
「そうです。保存するだけでなく、取得、更新、削除、無効化まで一緒に理解するとHttpSessionの流れが見えてきます。」
生徒
「これならログイン情報やショッピングカートを複数のServletで共有する仕組みもイメージできそうです。」
先生
「まずはsetAttributeとgetAttributeの基本を確実に覚え、そのあとrequestとの使い分けやセッションの削除まで広げていけば、Servletのセッション管理を理解しやすくなります。」
ChatGPTなどの生成AIをこれから学びたい方に向けて、AIスキルアカデミーの口コミ・評判、料金、無料セミナーの内容を詳しくまとめています。
AIスキルアカデミーの口コミ・評判を詳しく見る