2.

Apache Struts 入門と現代の代替フレームワーク(Struts 1/2 違い・移行)

編集
この記事の要点
  • Apache Struts は Java EE 向けの MVC Web フレームワーク。2000 年に Struts 1 が登場、2007 年に大幅刷新された Struts 2 がリリースされた
  • Struts 1 は 2013 年 4 月に EOL。新規開発は絶対に使用してはいけない(脆弱性が放置)
  • Struts 2 も S2-045 / S2-057 など重大な RCE 脆弱性が複数発見されており、Equifax の大規模情報漏洩 (2017) の原因にもなった
  • 新規開発は Spring MVC / Spring Boot または Jakarta EE (Quarkus / Micronaut) を選ぶのが現代の標準
  • 既存 Struts プロジェクトは 段階的に Spring MVC へ移行するのが現実解(一気の書き換えはリスク大)

Apache Struts とは

Apache Struts は、Apache Software Foundation が開発した Java EE 用の MVC Web アプリケーションフレームワークです。2000 年に Craig McClanahan により Struts 1 が発表され、当時の Java Web 開発のデファクト標準となりました。2007 年には設計を一新した Struts 2 がリリースされましたが、相次ぐ脆弱性報告と Spring の台頭により、現在はレガシーフレームワークと位置づけられています。

Struts 1 と Struts 2 の違い

項目Struts 1Struts 2
初版2000 年2007 年 (WebWork 由来)
EOL2013 年 4 月 (終了済)継続中だが推奨されない
コントローラAction + ActionFormPOJO Action (ActionSupport を継承)
設定ファイルstruts-config.xmlstruts.xml + アノテーション
式言語JSTL / ELOGNL (Object-Graph Navigation Language)
テスト容易性低い (Servlet 依存)高い (POJO ベース)
タグライブラリ 統一
Interceptorなしあり (Filter Chain)

Struts 2 の基本構成

典型的な Struts 2 の Action クラス:

package com.example.action;

import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport {
    private String userId;
    private String password;

    // OGNL がアクセスする getter/setter
    public String getUserId() { return userId; }
    public void setUserId(String v) { this.userId = v; }
    public String getPassword() { return password; }
    public void setPassword(String v) { this.password = v; }

    @Override
    public String execute() {
        if ("admin".equals(userId) && "secret".equals(password)) {
            return SUCCESS;  // "success" を返す → struts.xml で /home.jsp へ
        }
        addActionError("ID またはパスワードが違います");
        return INPUT;
    }
}

struts.xml 設定:




    
        
            /home.jsp
            /login.jsp
            /error.jsp
        
    

OGNL — Struts 2 の式言語

Struts 2 は値スタック (ValueStack) と OGNL を組み合わせて Action のプロパティに JSP からアクセスします:

<%@ taglib prefix="s" uri="/struts-tags" %>

    
    
    



    


<%-- OGNL 式で値表示 --%>


    

OGNL の表現力が高すぎることがセキュリティ上の弱点でもあります (後述)。

Interceptor — リクエスト処理の差し込み

Struts 2 の特徴的な機能。認証・バリデーション・ロギング等を Action 実行前後に挟めます:


    
        
        
            
            
        
    

    
        
        /dashboard.jsp
    

Struts の脆弱性履歴

Struts 2 で実際に悪用された主要 CVE:

CVE通称影響
CVE-2017-5638S2-045 (Jakarta Multipart)Equifax 漏洩 1.4 億人。Content-Type ヘッダで RCE
CVE-2018-11776S2-057namespace から OGNL 注入で RCE
CVE-2023-50164ファイルアップロードのパストラバーサル
CVE-2013-2251S2-016action: / redirect: で OGNL 注入

多くが OGNL の評価機構を悪用した RCE。Struts 2 を使い続ける場合は 常に最新パッチに追従することが必須です。

現代の代替フレームワーク

フレームワーク位置づけ特徴
Spring Boot / Spring MVC事実上の標準DI / AOP / Security / Data 等エコシステム全方位
Jakarta EE (MVC 2.0)標準仕様WildFly / Open Liberty / Payara で動作
Quarkus / MicronautクラウドネイティブGraalVM Native Image 対応、起動高速
HelidonOracle 製マイクロサービスSE/MP 2 モード、Netty ベース

Struts から Spring MVC への移行例

Struts 2 Action と Spring MVC Controller の対応:

// Spring MVC 版
@Controller
@RequestMapping("/login")
public class LoginController {

    @PostMapping
    public String login(@RequestParam String userId,
                        @RequestParam String password,
                        Model model) {
        if ("admin".equals(userId) && "secret".equals(password)) {
            return "home";    // /WEB-INF/views/home.jsp
        }
        model.addAttribute("error", "ID またはパスワードが違います");
        return "login";
    }
}

移行のステップ:

  1. Spring 依存を pom.xml に追加(Struts と共存可能)
  2. 新規機能から Spring MVC で実装
  3. 既存 Action を 1 つずつ Controller に書き換え
  4. JSP タグを や JSTL に置換
  5. すべて移行後に Struts 依存を削除

FAQ

Q: 既存 Struts 1 のシステムを残してよい?
A: 推奨しません。EOL 済で脆弱性パッチも出ません。最低限インターネットから隔離し、計画的に移行してください。

Q: Struts 2 と Spring MVC のどちらが速い?
A: スループットは大差ありませんが、Spring Boot の方が起動と開発速度で圧倒的に有利。エコシステム規模も比較になりません。

Q: OGNL は安全に使える?
A: 評価対象を明示的に制限(devMode=falsestruts.ognl.allowStaticMethodAccess=false)すればリスクは下がりますが、根本的に複雑で監査が困難。新規採用は避けるべきです。

関連項目

  • Spring MVC / Spring Boot — 移行先の本命
  • JSF (Jakarta Faces) — Oracle / Red Hat 系の選択肢
  • Play Framework — Scala/Java 両対応のリアクティブフレームワーク
  • Equifax 情報漏洩事件 — Struts 2 脆弱性を未パッチで放置した教訓
編集
Post Share
子ページ
  1. 導入方法
  2. struts-config.xmlの説明
  3. ActionForm
  4. Action
  5. エラー一覧
  6. JSP タグ
  7. カスタムタグ(tablib)
同階層のページ
  1. Spring Framework
  2. Struts
  3. Java EE