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).
Жизненный цикл запроса
- Пользователь отправляет HTTP-запрос на сервер.
FilterDispatcherперехватывает запрос и определяет, какое действие должно быть выполнено (на основе URL или параметров).- Применяется стек перехватчиков, которые выполняют предварительную обработку (валидация, загрузка файлов, установка параметров).
- Вызывается метод
execute()(или другой указанный метод) класса Action. - Action обрабатывает бизнес-логику и возвращает строковый результат.
- Выполняется пост-обработка перехватчиками.
- На основе результата выбирается соответствующее представление (JSP, шаблон), которое генерирует HTML-ответ.
- Ответ отправляется пользователю.
Ключевые особенности
Поддержка интернационализации (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 2 | Spring 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 →