ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
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 1 | Struts 2 |
|---|---|---|
| 初版 | 2000 年 | 2007 年 (WebWork 由来) |
| EOL | 2013 年 4 月 (終了済) | 継続中だが推奨されない |
| コントローラ | Action + ActionForm | POJO Action (ActionSupport を継承) |
| 設定ファイル | struts-config.xml | struts.xml + アノテーション |
| 式言語 | JSTL / EL | OGNL (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-5638 | S2-045 (Jakarta Multipart) | Equifax 漏洩 1.4 億人。Content-Type ヘッダで RCE |
| CVE-2018-11776 | S2-057 | namespace から OGNL 注入で RCE |
| CVE-2023-50164 | — | ファイルアップロードのパストラバーサル |
| CVE-2013-2251 | S2-016 | action: / 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 対応、起動高速 |
| Helidon | Oracle 製マイクロサービス | 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";
}
}
移行のステップ:
- Spring 依存を pom.xml に追加(Struts と共存可能)
- 新規機能から Spring MVC で実装
- 既存 Action を 1 つずつ Controller に書き換え
- JSP タグを
や JSTL に置換 - すべて移行後に Struts 依存を削除
FAQ
Q: 既存 Struts 1 のシステムを残してよい?
A: 推奨しません。EOL 済で脆弱性パッチも出ません。最低限インターネットから隔離し、計画的に移行してください。
Q: Struts 2 と Spring MVC のどちらが速い?
A: スループットは大差ありませんが、Spring Boot の方が起動と開発速度で圧倒的に有利。エコシステム規模も比較になりません。
Q: OGNL は安全に使える?
A: 評価対象を明示的に制限(devMode=false、struts.ognl.allowStaticMethodAccess=false)すればリスクは下がりますが、根本的に複雑で監査が困難。新規採用は避けるべきです。
関連項目
- Spring MVC / Spring Boot — 移行先の本命
- JSF (Jakarta Faces) — Oracle / Red Hat 系の選択肢
- Play Framework — Scala/Java 両対応のリアクティブフレームワーク
- Equifax 情報漏洩事件 — Struts 2 脆弱性を未パッチで放置した教訓
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
- Spring Framework
- Struts
- Java EE
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Laravel キャッシュクリア完全ガイド(cache:clear / config:clear / 2026-05-18 07:42:07
- プロジェクトの作成と削除 2026-05-18 07:42:07
- インストール直後にNetbeansが反応しない 2026-05-18 07:42:07
- 動画やチャンネルの検索 2026-05-18 07:42:07
- APIキー取得方法 2026-05-18 07:42:07
- チャンネル情報の取得 2026-05-18 07:42:07
- API 入門 — Web API(REST / GraphQL / gRPC / 2026-05-18 07:42:07
- インストール(eclipseプラグイン) 2026-05-18 07:42:07
- Laravel「Dotenv values containing spaces must be surrounded 2026-05-18 07:42:07
- エラー一覧 2026-05-18 07:42:07
- curl: (51) SSL: certificate subject name '~' does not match 2026-05-18 07:42:07
- インストール方法(Windows版) 2026-05-18 07:42:07
- JSONから配列に変換 2026-05-18 07:42:07
- 処理を一定時間待つ 2026-05-18 07:42:07
- A non well formed numeric value encountered 2026-05-18 07:42:07
コメントを削除してもよろしいでしょうか?