セッション管理の基本から、Struts2での実践的な使い方までを解説!
✅ 1. SessionAware
/ RequestAware
とは?
Struts2では、セッションやリクエストを Javaのコード側で直接扱えるようにするためのインターフェース が用意されています。それが以下の2つです。
インターフェース | 概要 |
---|---|
SessionAware |
セッションスコープのデータを Map 形式で扱えるようにする |
RequestAware |
リクエストスコープのデータを Map 形式で扱えるようにする |
✅ 2. どう使うの?(例)
🎯 SessionAwareの使い方
public class LoginAction extends ActionSupport implements SessionAware {
private Map<String, Object> session;
@Override
public void setSession(Map<String, Object> session) {
this.session = session;
}
public String execute() {
// ログイン成功後、ユーザー情報をセッションに保存
session.put("loginUser", "tanaka");
return SUCCESS;
}
}
-
setSession()
はStruts2フレームワークによって自動的に呼び出されます。 -
session.put()
を使えば、Javaからセッションに値を格納できます。
🎯 RequestAwareの使い方
public class SampleAction extends ActionSupport implements RequestAware {
private Map<String, Object> request;
@Override
public void setRequest(Map<String, Object> request) {
this.request = request;
}
public String execute() {
request.put("message", "リクエストスコープにセットした値");
return SUCCESS;
}
}
スコープ | インターフェース | 特徴 |
---|---|---|
セッション | SessionAware |
ユーザーがログアウトするまで持続する。ログイン情報、カート情報などに適している。 |
リクエスト | RequestAware |
リクエスト単位。画面間で値を渡す必要がない一時的なデータに使う。 |
⚠
SessionAware
はログイン情報など、長期間保持したい情報に向いています。
✅ 4. 画面(JSP)での値の受け取り方
セッションに格納した値は、JSPで以下のように参照できます:
ログインユーザー: <s:property value="#session.loginUser" />
リクエストスコープの値も同様に:
メッセージ: <s:property value="#request.message" />
✅ 5. よくある落とし穴
❌ NG: セッションをActionクラスでnewしない!
// これは絶対にNG
session = new HashMap<>(); // ← Struts2がDIしてくれなくなる!
❌ NG: セッションやリクエストに複雑すぎるデータを入れない
セッションスコープに大きなリストやオブジェクトを入れると、メモリを圧迫する原因になります。
✅ 6. 補足:ActionContext
を使う方法もある
実は、インターフェースを実装しなくても ActionContext
経由でスコープを取得できます:
Map<String, Object> session = ActionContext.getContext().getSession();
Map<String, Object> request = (Map<String, Object>) ActionContext.getContext().get("request");
ただし、
SessionAware
やRequestAware
の方がテストしやすく、設計的にも明示的なので推奨されます。
📝 まとめ
機能 | 使うインターフェース | 備考 |
---|---|---|
セッションに値を入れる | SessionAware |
ログイン状態、カートなど |
リクエストに値を入れる | RequestAware |
一時的な表示用データなど |
どちらもMapで扱う | - | JSP側では #session , #request で参照 |
Struts2でのスコープ管理は、SessionAware
と RequestAware
を使うことで非常にシンプルになります。
正しく使い分けて、安全で保守性の高いWebアプリを構築しましょう!
🧭 関連記事(Vol.11.xxxシリーズ)
連番 | タイトル | 内容分類 |
---|---|---|
Vol.11.0 | Struts2が提供してくれる便利機能まとめ9選 | 導入&概要 |
Vol.11.1 | 自動注入とステートレスActionの仕組み | フレームワーク内部理解 |
Vol.11.2 | UX改善に効く!アクション層設計と入力制御の極意(プロローグ) | UX設計・アクション層総論 |
Vol.11.2.1 | 【実践編】Struts2アクション層の役割と設計パターン(Command型 / UIアクション分離など) | アクション設計パターン |
Vol.11.2.2 | 【UX重視】戻るボタン・キャンセル処理の設計手法と「戻り先管理」のスマート実装 | 戻り先制御とUX設計 |
Vol.11.2.3 | 【設計ノウハウ】多画面遷移時のパラメータ受け渡し・保持戦略(セッション vs hidden vs URL) | パラメータ多重管理 |
Vol.11.2.4 | 【実践ガイド】ユーザー操作を考慮したアクション遷移設計(リダイレクト vs フォワードの使い分け) | UX遷移設計/Result制御 |
Vol.11.2.5 | 【トラブル防止】アクション層の共通処理とメンテナブルなBaseAction設計 | アクション共通化/保守性 |
Vol.11.3 | Struts2の defaultStack とは?Interceptorの中身を詳しく追ってみる | Interceptor |
Vol.11.3.2 | 🔧 Vol.11.3.2 独自Interceptorの作り方と使い所 Struts2のカスタマイズを“実践で使えるレベル”に一歩進めよう | Interceptor |
Vol.11.4 | 入門者のための「パラメータ自動バインディング」完全理解ガイド | 自動バインディング |
Vol.Vol.11.4.1 | 入門者のための自動バインディング実践パターン集 | 自動バインディング |
Vol.11.5 | Struts2の構成理解が“実務レベル”へと進化する決定版 | 設定ファイル構造 |
Vol.11.5.1 | Struts2の“画面遷移の全体像”を理解するためのマイルストーン記事 | 設定ファイル構造 |
Vol.11.6 | ActionSupport の便利メソッドと国際化対応 | ユーティリティ / i18n |
Vol.11.7 | validate() / input 戦略とUX設計 | 開発スタイルの違い |
Vol.11.8 | アノテーションベースの設定 vs XML定義の比較 | 開発スタイルの違い |
Vol.11.9 | バリデーション完全解説(XML / アノテーション) | バリデーション(※Vol.8補完) |
Vol.11.10 | Struts2の「OGNL」ってなに?しくみと使い方をやさしく解説 | 式言語OGNL解説 |
Vol.11.11 | ModelDriven インターフェースの使いどころと注意点 | Model駆動開発 |
Vol.11.13 | Resultタイプ完全解説(dispatcher / redirect / stream など) | 遷移パターン理解 |
Vol.11.14 | Vol.11.14 ValueStackの中身を理解する – 画面とActionの橋渡し役 | Action |
Vol.11.15 | Interceptorチェーンを自作してみよう(ログ / 認証フィルタ) | Interceptor |
Vol.11.16 | エラー処理と例外ハンドリングの実践パターン | ハンドリング設計 |
Vol.11.17 | Struts2でファイルアップロード機能を実装する方法 | 実装系Tips |
Vol.11.18 | 非同期通信(AJAX)とStruts2の連携方法 | フロント連携編 |
Vol.11.19 | セキュリティ対策(CSRF, XSS, パラメータ偽装) | セキュリティ対策 |
Vol.11.20 | 複数フォームを安全に扱う!セッション管理と動的フォームの考え方 | セッション管理 |
Vol.11.21 | Struts2でJSONを返す!REST API連携と非同期通信の基本設計 | セッション管理 |
Vol.11.22 | 本番環境構成とセキュリティ設計(Apache+Tomcat+Struts2連携) | 外部公開 |