はじめに (対象読者・この記事でわかること)

この記事は、Java サーブレット開発に携わっているエンジニア、特に HttpServletRequest#setAttribute を利用した情報共有やリクエストスコープでのデータ受け渡しを実装したが、実際に属性が正しくセットされているか確認したい方を対象としています。
本稿を読むことで、以下ができるようになります。

  • サーブレットやフィルタ内で setAttribute されたオブジェクトを 取得・表示 する方法
  • JSP/EL で属性を 確認 する手順
  • デバッグ時に便利な ログ出力 のテクニックや、開発ツール(IDE のブレークポイント)を活用した検証方法

サーブレットの開発経験はあるが、属性確認のベストプラクティスが曖昧だったという方に最適です。

前提知識

この記事を読み進める上で、以下の知識があるとスムーズです。

  • Java 8 以上の基本的な文法
  • サーブレット API(HttpServletRequestHttpServletResponse)の基礎
  • Maven/Gradle でのプロジェクト構築経験(※必須ではない)

HttpServletRequest の属性管理:概要と背景

Web アプリケーションでは、リクエストスコープ に情報を一時的に格納し、後続のサーブレットや JSP に渡すことが頻繁にあります。HttpServletRequest#setAttribute(String name, Object o) はその代表的な手段です。

しかし、属性は文字列キーで管理されるため、タイプミススコープの誤解 が原因で予期せぬ null が返ってくるケースが多々あります。特に以下のようなシーンで属性確認が重要です。

  1. 認証情報の共有:認証フィルタでユーザー情報をセットし、コントローラで取得
  2. リクエストパラメータの前処理:バリデーション結果や変換後のオブジェクトを格納
  3. エラーハンドリング:エラーメッセージや例外オブジェクトを次のビューへ渡す

適切に属性を確認できれば、デバッグ時間の短縮はもちろん、コードの可読性・保守性も向上します。本節では、属性確認の 基本概念注意点 を整理します。

  • 属性名は一意 に保つこと(チーム内で命名規則を統一)
  • オブジェクトの型 を意識し、instanceof でチェックする
  • スコープの違い(リクエスト vs セッション vs アプリケーション)を混同しない

HttpServletRequest の属性を具体的に確認する手順

以下では、実際のコード例を交えて属性確認の流れを段階的に解説します。サンプルは Spring Boot ではなく純粋な Servlet コンテナ(Tomcat)を想定していますが、概念はどのフレームワークでも共通です。

ステップ1:属性の設定

まずはサーブレット(またはフィルタ)で属性をセットします。ここでは、認証済みユーザー情報を User オブジェクトとして格納する例です。

Java
// LoginServlet.java @WebServlet("/login") public class LoginServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String username = req.getParameter("username"); // 本来は認証ロジックを呼び出す User user = AuthService.authenticate(username); if (user != null) { // リクエストスコープに格納 req.setAttribute("loginUser", user); // デバッグ用にログ出力 LoggerFactory.getLogger(LoginServlet.class) .info("Set attribute [loginUser] : {}", user); // 次の画面へフォワード req.getRequestDispatcher("/welcome.jsp").forward(req, resp); } else { resp.sendRedirect("login.jsp?error=1"); } } }

ポイント:

  • キーは "loginUser" と文字列リテラルで統一。
  • Logger で即時にログに出力しておくと、属性が正しく設定されたか瞬時に確認できます。

ステップ2:属性の取得と表示(JSP/EL)

welcome.jsp 側で属性を取得し、画面に表示します。EL(Expression Language)を利用すれば、型キャスト不要で簡潔に書けます。

Jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <!DOCTYPE html> <html> <head> <title>Welcome</title> </head> <body> <h2>ようこそ、${loginUser.name} さん!</h2> <p>権限: ${loginUser.role}</p> <!-- デバッグ用に属性全体を表示 --> <pre> ${requestScope} </pre> </body> </html>
  • ${loginUser}setAttribute でセットしたオブジェクトを指す。
  • <pre>${requestScope}</pre> はリクエストスコープにある全属性をマップ形式で出力し、開発中の「属性が本当に入っているか」を一目で確認できます。

ステップ3:サーバーサイドでの属性確認(フィルタ/インターセプタ)

属性はサーブレットだけでなく、フィルタ でも取得可能です。ここではデバッグフィルタを作成し、全リクエストに対して属性一覧をログに出力します。

Java
@WebFilter("/*") public class AttributeLogFilter implements Filter { private static final Logger logger = LoggerFactory.getLogger(AttributeLogFilter.class); @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpReq = (HttpServletRequest) request; // チェーンを続行した後に属性をチェック(属性設定後の状態が欲しいので) chain.doFilter(request, response); Enumeration<String> names = httpReq.getAttributeNames(); Map<String, Object> attrMap = new HashMap<>(); while (names.hasMoreElements()) { String name = names.nextElement(); attrMap.put(name, httpReq.getAttribute(name)); } logger.info("Request attributes after processing: {}", attrMap); } }
  • chain.doFilter前後 にログ出力タイミングを変えると、属性が設定前・設定後の両方を比較できます。
  • Map に変換して出力すれば、JSON ライクに見やすくなる点がメリットです。

ハマった点やエラー解決

1. null が返ってくるケース

  • 原因:属性名のスペルミス(例: loginUserloginuser
  • 対策:IDE の定数化(public static final String ATTR_LOGIN_USER = "loginUser";)で一元管理。

2. 型キャスト例外 (ClassCastException)

  • 原因:JSP/EL で String として扱おうとして User オブジェクトを直接出力した
  • 対策:EL では自動的に toString() が呼ばれるが、明示的に UsergetName() などのメソッドが必要。ビジネスロジック側で DTO に変換して渡すと安全。

3. フィルタで属性が見えない

  • 原因chain.doFilter にログ出力したため、まだ属性がセットされていなかった。
  • 対策 にログを取るか、AsyncListener 等で非同期処理後に取得する。

解決策まとめ

問題 根本原因 解決策
属性が null キーの誤植 定数化・IDE のリファクタリング
ClassCastException 型不一致 EL でメソッド呼び出し、DTO 変換
フィルタで取得できない 実行順序の誤解 chain.doFilter 後に取得、もしくは OncePerRequestFilter の利用

まとめ

本記事では、HttpServletRequest#setAttribute でセットした属性を確実に確認する手順 を解説しました。

  • 属性の設定 は一意なキーと即時ログ出力で可視化
  • JSP/EL での取得は ${attribute} で簡潔に表示、requestScope で全属性をデバッグ可能
  • フィルタ を活用すれば、リクエスト全体の属性状態をサーバーサイドでログに残せる

これらのテクニックにより、属性の不一致や見落としを防ぎ、デバッグ効率が大幅に向上します。次回は、リクエスト属性をセッション属性へ安全にコピーする方法属性の自動クリア@RequestScope との併用)について取り上げる予定です。

参考資料