Открыть сервис

Apache Struts

Apache Struts — это свободный фреймворк с открытым исходным кодом для создания веб-приложений на языке Java, реализующий архитектурный шаблон Model-View-Controller (MVC). Struts предназначен для упрощения разработки крупных, масштабируемых и поддерживаемых серверных приложений, разделяя логику представления, бизнес-логику и управление потоками данных. Фреймворк является частью экосистемы Apache Software Foundation и широко применялся в корпоративной среде в начале 2000-х годов.

История

Создание и ранние версии

Первая версия Apache Struts (Struts 1) была выпущена в 2000 году. Её создателем является Крейг МакКланахан, который первоначально разработал проект как часть более крупной инициативы Jakarta Project под эгидой Apache Software Foundation. Struts 1 быстро стал популярным благодаря своей способности структурировать код веб-приложений, что было особенно актуально в эпоху доминирования сервлетов и JSP (JavaServer Pages). Фреймворк использовал XML-файлы конфигурации (struts-config.xml) для определения связей между действиями (Action) и представлениями (JSP).

Struts 2 и эволюция

В 2006 году вышла версия Struts 2, которая представляла собой кардинально переработанный фреймворк, основанный на архитектуре WebWork (проект, разработанный компанией OpenSymphony). Struts 2 не был обратно совместим с Struts 1, но предлагал ряд улучшений: использование аннотаций Java для конфигурации, более простую интеграцию с POJO (Plain Old Java Objects), мощную систему перехватчиков (interceptors) и улучшенную поддержку AJAX. Несмотря на выход Struts 2, поддержка Struts 1 продолжалась до 2013 года, когда проект был официально объявлен устаревшим (End of Life).

Современное состояние

К 2020-м годам популярность Apache Struts значительно снизилась из-за появления более современных и лёгких фреймворков, таких как Spring MVC, Spring Boot и Jakarta Server Faces (JSF). Тем не менее, Struts 2 продолжает развиваться и поддерживаться сообществом. По состоянию на 2024 год актуальной является версия Struts 2.5.x, а также ведётся работа над версией 6.0.0, которая будет полностью совместима с Jakarta EE 9+. Однако из-за уязвимостей безопасности, связанных с фреймворком, многие компании активно мигрируют с него на альтернативные решения.

Архитектура и принцип работы

Шаблон MVC

Apache Struts реализует классический шаблон Model-View-Controller (MVC), разделяющий приложение на три компонента:

  • Model (Модель): отвечает за бизнес-логику и данные. В Struts моделью могут быть обычные Java-классы (POJO), JavaBeans или объекты доступа к данным (DAO).
  • View (Представление): отвечает за отображение данных пользователю. В Struts 2 представлением обычно являются JSP-страницы, FreeMarker-шаблоны или Velocity-шаблоны. Фреймворк предоставляет набор пользовательских тегов (Struts Tags), упрощающих связь с моделью.
  • Controller (Контроллер): управляет потоком запросов. В Struts 2 центральным контроллером является сервлет-фильтр FilterDispatcher (или StrutsPrepareAndExecuteFilter), который анализирует входящие HTTP-запросы и направляет их на соответствующие объекты действий (Action).

Основные компоненты Struts 2

  • Action (Действие): класс, который обрабатывает запрос. Он может возвращать строковый результат (например, "success", "error"), который определяет, какое представление будет отображено.
  • Interceptor (Перехватчик): ключевой элемент архитектуры Struts 2. Перехватчики выполняют предварительную и последующую обработку запросов (например, проверка авторизации, валидация данных, логирование). Они образуют стек (Stack), который применяется к каждому действию.
  • Result (Результат): объект, который определяет, как отображать результат выполнения действия. Типы результатов включают диспетчеризацию на JSP, перенаправление (redirect), потоковую передачу данных (stream) и другие.
  • Конфигурация: настройка фреймворка осуществляется через XML-файл struts.xml, а также с помощью аннотаций Java (например, @Action, @Result).

Жизненный цикл запроса

  1. Пользователь отправляет HTTP-запрос на сервер.
  2. FilterDispatcher перехватывает запрос и определяет, какое действие должно быть выполнено (на основе URL или параметров).
  3. Применяется стек перехватчиков, которые выполняют предварительную обработку (валидация, загрузка файлов, установка параметров).
  4. Вызывается метод execute() (или другой указанный метод) класса Action.
  5. Action обрабатывает бизнес-логику и возвращает строковый результат.
  6. Выполняется пост-обработка перехватчиками.
  7. На основе результата выбирается соответствующее представление (JSP, шаблон), которое генерирует HTML-ответ.
  8. Ответ отправляется пользователю.

Ключевые особенности

Поддержка интернационализации (i18n)

Struts 2 предоставляет встроенную поддержку локализации. Сообщения и метки интерфейса могут храниться в файлах свойств (resource bundles), а фреймворк автоматически выбирает нужный язык на основе настроек браузера пользователя или сессии.

Валидация данных

Struts 2 поддерживает как программную валидацию (внутри класса Action), так и декларативную (с помощью XML-файлов валидации или аннотаций). Валидация может быть выполнена на стороне клиента (JavaScript) и на стороне сервера.

Управление исключениями

Фреймворк позволяет декларативно обрабатывать исключения, сопоставляя типы исключений с определёнными результатами (например, перенаправление на страницу ошибки).

Интеграция с другими технологиями

Struts 2 легко интегрируется с другими Java-фреймворками, такими как Hibernate (для работы с базами данных), Spring (для внедрения зависимостей) и Tiles (для управления макетами страниц).

Уязвимости и безопасность

Критические уязвимости

Apache Struts стал печально известен из-за серии критических уязвимостей безопасности, которые приводили к удалённому выполнению кода (RCE). Наиболее громкие инциденты:

  • CVE-2017-5638 (март 2017): уязвимость в обработчике Content-Type, позволявшая злоумышленнику выполнить произвольный код. Эта уязвимость была использована при атаке на серверы компании Equifax, что привело к утечке данных 147 миллионов человек.
  • CVE-2018-11776 (август 2018): уязвимость, связанная с неправильной обработкой namespace в конфигурации, что позволяло выполнить код.
  • CVE-2023-50164 (декабрь 2023): уязвимость в механизме загрузки файлов, позволявшая обойти ограничения и выполнить код.

Причины уязвимостей

Основные проблемы безопасности Struts связаны с его сложной архитектурой, обширным использованием рефлексии в Java и большим количеством конфигурационных возможностей. Многие уязвимости возникали из-за неправильной обработки пользовательского ввода в перехватчиках и механизмах OGNL (Object-Graph Navigation Language), который используется для привязки данных между представлением и моделью.

Рекомендации по безопасности

Разработчикам, продолжающим использовать Struts 2, рекомендуется:

  • Немедленно обновлять фреймворк до последней стабильной версии.
  • Использовать минимально необходимый набор перехватчиков.
  • Отключать неиспользуемые функции (например, динамическое выполнение методов).
  • Тщательно валидировать и санировать все входные данные.

Применение

Корпоративные системы

В 2000-е годы Apache Struts был стандартом де-факто для разработки корпоративных веб-приложений на Java. Он использовался в банковских системах, государственных порталах, системах управления контентом (CMS) и электронной коммерции. В России Struts применялся в ряде проектов государственных и коммерческих структур, особенно в период с 2005 по 2015 год.

Наследие

Несмотря на снижение популярности, огромное количество legacy-приложений, написанных на Struts 1 и Struts 2, продолжают эксплуатироваться. Поддержка этих систем остаётся актуальной задачей для многих IT-компаний. Миграция с Struts на современные фреймворки (например, Spring Boot) часто является дорогостоящим и длительным процессом.

Сравнение с альтернативами

ХарактеристикаApache Struts 2Spring MVC
АрхитектураMVC с перехватчикамиMVC с DispatcherServlet
КонфигурацияXML + аннотацииАннотации, Java Config, XML
Внедрение зависимостейЧерез интеграцию с SpringВстроенное (Spring IoC)
БезопасностьМного критических уязвимостейБолее безопасен при правильной настройке
Популярность (2024)Низкая, legacy-проектыОчень высокая
Кривая обученияСредняяСредняя (выше из-за экосистемы Spring)

Интересные факты

  • Название «Struts» происходит от английского слова «strut» (распорка, подпорка), что отражает роль фреймворка как «скелета» приложения.
  • Изначально Struts 1 был вдохновлён архитектурой Apache Cocoon и Ruby on Rails.
  • В 2013 году Apache Software Foundation объявила о прекращении поддержки Struts 1, рекомендовав всем пользователям перейти на Struts 2.
  • Уязвимость CVE-2017-5638 считается одной из самых опасных в истории Java-веб-разработки из-за масштаба атаки на Equifax.

Источники

  • Apache Struts Official Documentation (Apache Software Foundation)
  • "Struts 2 in Action" by Donald Brown, Chad Davis, Scott Stanlick
  • CVE database (MITRE) — записи CVE-2017-5638, CVE-2018-11776, CVE-2023-50164
  • "Java Web Development: A Practical Guide" — разделы по истории Struts
  • Отчёты о безопасности OWASP (Open Web Application Security Project)

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →