この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:6
ページ更新者:atom
更新日時:2026-06-11 07:12:00

タイトル: Struts
SEOタイトル: 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 ベース)
タグライブラリ<html:> <bean:> <logic:><s:> 統一
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 (&quot;admin&quot;.equals(userId) &amp;&amp; &quot;secret&quot;.equals(password)) {
            return SUCCESS;  // &quot;success&quot; を返す → struts.xml で /home.jsp へ
        }
        addActionError(&quot;ID またはパスワードが違います&quot;);
        return INPUT;
    }
}

struts.xml 設定:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
    "http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
    <package name="default" extends="struts-default" namespace="/">
        <action name="login" class="com.example.action.LoginAction">
            <result name="success">/home.jsp</result>
            <result name="input">/login.jsp</result>
            <result name="error">/error.jsp</result>
        </action>
    </package>
</struts>

OGNL — Struts 2 の式言語

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

<%@ taglib prefix="s" uri="/struts-tags" %>
<s:form action="login">
    <s:textfield name="userId" label="ユーザー ID"/>
    <s:password name="password" label="パスワード"/>
    <s:submit value="ログイン"/>
</s:form>

<s:if test="hasActionErrors()">
    <s:actionerror/>
</s:if>

<%-- OGNL 式で値表示 --%>
<s:property value="userId"/>
<s:iterator value="users" var="u">
    <s:property value="#u.name"/>
</s:iterator>

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

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

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

<package name="default" extends="struts-default">
    <interceptors>
        <interceptor name="auth" class="com.example.AuthInterceptor"/>
        <interceptor-stack name="authStack">
            <interceptor-ref name="auth"/>
            <interceptor-ref name="defaultStack"/>
        </interceptor-stack>
    </interceptors>

    <action name="dashboard" class="com.example.DashboardAction">
        <interceptor-ref name="authStack"/>
        <result>/dashboard.jsp</result>
    </action>
</package>

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(&quot;/login&quot;)
public class LoginController {

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

移行のステップ:

  1. Spring 依存を pom.xml に追加(Struts と共存可能)
  2. 新規機能から Spring MVC で実装
  3. 既存 Action を 1 つずつ Controller に書き換え
  4. JSP タグを <form:input> や 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 脆弱性を未パッチで放置した教訓