【Spring MVC】HTTPセッションの管理(@SessionAttributesのnames属性を使用)

概要

Spring MVCにて@SessionAttributesを使用して、HTTPセッションを利用する方法についてまとめた。
@SessionAttributesは、1つのコントローラー内にて複数のリクエスト間で共有するオブジェクトを、HTTPセッションで管理するために使用する。

この記事では、@SessionAttributesのnames属性を用いたHTTPセッションの基本的な使い方について紹介する。

 

補足

@SessionAttributesのtypes属性を使用したセッション管理方法は以下を参照。

あわせて読みたい

概要 Spring MVCにて@SessionAttributesを使用して、HTTPセッションを利用する方法についてまとめた。 @SessionAttributesは、1つのコントローラー内にて複数のリクエスト間で共有するオブジェクト[…]

【Spring MVC】HTTPセッションの管理(@SessionAttributesのtypes属性を使用)

 

基本的な使い方

@SessionAttributesは、SpringMVCにおいてHTTPセッションを「コントローラー単位」で安全に管理するための仕組みとなる。
このアノテーションは、javax.servlet.http.HttpSessionを直接操作する代わりに、
Modelに追加されたオブジェクトを自動でセッションに同期保存できるようにラップしたものになる。

基本的には以下の流れで使用する。

① セッション管理対象のオブジェクトを指定
② 対象オブジェクトのModel操作でセッションに同期
③ セッション操作が完了したら削除

 

セッション管理オブジェクトの指定

コントローラーに@SessionAttributesを付与し、names属性にHTTPセッションで管理させたいオブジェクトのキーを指定する
このキーを指定してModelにオブジェクトを格納すると、セッション管理対象となる。

 

HogeController.java


@Controller
@RequestMapping(value = "bar")
@SessionAttributes(names = { "hoge" })
public class HogeController {

 

@SessionAttributes(names = { “hoge” })

アノテーションのnames属性に”hoge”を指定することで、Modelに”hoge”というキーで追加されたオブジェクトは自動でセッションに保存されることになる。
※複数管理したいオブジェクトが存在する場合、キーをカンマ区切りで指定する

 

セッション管理オブジェクトの格納

セッションで管理するオブジェクトを、Modelに追加して初期化する。

 

HogeController.java


@ModelAttribute(name = "hoge")	
public HogeForm setUpForm() {	
	return new HogeForm();
}	

 

@ModelAttribute(name = “hoge”)
public HogeForm setUpForm() {

@ModelAttribute(name = “hoge”)を付けたメソッドが実行されると、
その戻り値(ここではHogeFormのインスタンス)が”hoge”というキーでModelに格納される。

@SessionAttributesで”hoge”が指定されているため、
Modelに追加されたこのオブジェクトは、名前の一致により自動的にセッションにも保存される。

 

セッション管理オブジェクトの利用

セッション内のオブジェクトを利用する場合、Model内の対象オブジェクトを操作する。

 

HogeController.java


@PostMapping(value = "/foo")
public String foo(@ModelAttribute("hoge") HogeForm form) {
	form.setInput01("書き換え");
	return "redirect:/bar/foo";
}

 

@PostMapping(value = “/foo”)
public String foo(@ModelAttribute(“hoge”) HogeForm form) {

ハンドラメソッドの引数に@ModelAttribute(“hoge”)HogeFormを指定することで、
Modelに”hoge”というキーで登録されているオブジェクトをHogeFormにバインドする。

さらに、POSTリクエストのハンドラで引数として受けとっていることで、
リクエスト内容がHogeFormにバインドされると同時に、セッション内のHogeFormにも自動的に更新内容が反映される。

 

form.setInput01(“書き換え”);

Modelから取得したHogeFormの値を書き換えても、セッション内のHogeFormに自動で更新内容が反映される。

 

セッション管理オブジェクトの削除

セッションに保存したオブジェクトを削除する場合、SessionStatusを使用する。

 

HogeController.java


@GetMapping(value = "/complete")
public String complete(SessionStatus sessionStatus) {
	sessionStatus.setComplete();
	return "bar/complete";
}

 

@GetMapping(value = “/complete”)
public String complete(SessionStatus sessionStatus) {

SessionStatusはハンドラメソッドの引数にて取得できる。

 

sessionStatus.setComplete();

@SessionAttributesにて指定した管理対象オブジェクトはすべて削除される。

 

Viewからのアクセス

セッションに保存したオブジェクトにアクセスする。

 

hoge.jsp


<tr>	
	<th>入力1: </th>
	<td>${hoge.input01}</td>
</tr>	

 

<td>${hoge.input01}</td>

EL式を利用して${Modelで管理しているセッションオブジェクトキー.属性名}を指定することでアクセスできる。

 

 

まとめ

 

☑ @SessionAttributesのnames属性に型を指定して、セッションに保存する対象を決める

☑ Modelを通じてセッション内のオブジェクトを更新する

☑ 処理の完了時にSessionStatus#setComplete()を呼び出して、セッションから削除する

スポンサーリンク