Может ли приложение Wicket запустить перезапуск самого себя без пароля менеджера?

StackOverflow https://stackoverflow.com/questions/1850122

  •  13-09-2019
  •  | 
  •  

Вопрос

Я новичок в Wicket и хотел бы поддерживать веб-приложение изнутри самого себя, используя какую-то страницу администратора обслуживания для запуска очистки, обновления базы данных, восстановления и так далее.Поскольку я планирую использовать Hibernate или аналогичный для привязки данных, я хотел бы запустить полную перезагрузку приложения изнутри самого себя, не предоставляя всем, кто сможет выполнить эти действия, сопутствующий пароль Tomcat manager.

Насколько я выяснил, похоже, нет простого способа запустить реальный перезапуск веб-приложения Java без пароля менеджера?Однако, поскольку существует множество веб-приложений Java, имеющих такую функцию перезапуска в своих административных панелях, я предполагаю, что должна быть возможность запустить перезапуск либо в определенных контейнерах сервлетов, либо в некоторых веб-фреймворках.Они как-то должны были выполнить этот трюк?(или, может быть, они на самом деле не перезапускаются с нуля, а просто повторно инициализируются без чистого перезапуска?)

Я не смог найти ничего о том, что Wicket или Tomcat могут запускаться при завершении работы и перезапуске из своих приложений, хотя в Wicket есть некоторые внутренние методы, которые могли бы это сделать?(могут быть доступны публично, но JavaDoc не рекомендует этого делать, поскольку они предназначены только для внутреннего использования)

С точки зрения безопасности я действительно не понимаю, почему приложение не должно иметь возможности запрашивать такой перезапуск из своего собственного кода.

Можно ли это сделать, и если да, то что мне нужно будет сделать в моем приложении, чтобы перезапустить его?

Редактировать: Просто чтобы сделать мой вопрос более точным:Ни у пользователя, ни у приложения не должно быть никакого пароля, который можно было бы использовать для доступа к интерфейсу Tomcat manager.Я думал о каком-нибудь методе для вызова или каком-нибудь флаге для установки, чтобы контейнер сервлета запускался для перезапуска этого конкретного приложения без необходимости авторизации для этого.Мои мысли заключаются в том, что, поскольку приложение запущено в контейнере сервлетов, у него должен быть какой-то способ завершить работу и перезапустить.Если это вообще невозможно с серверами приложений Java, может быть какой-то способ сделать это на уровне приложения, выполнив вызов базовой платформы (в данном случае Wicket), чтобы завершить все запущенные потоки, очистить как можно больше и перезапустить приложение с помощью платформы;что-то вроде "мягкой перезагрузки" стека приложений.

Это было полезно?

Решение

То, что ваше приложение использует Wicket, в основном не имеет отношения к вашему вопросу.Это веб-приложение Java, использующее фреймворк Wicket.Сформулированный таким образом, вы ищете, как перезапустить веб-приложение, используя контейнер Tomcat.Если вы выберете другой контейнер веб-приложения (jetty и т.д.), вам нужно будет изменить процедуру.

Вы можете нажать на этот URL, чтобы запустить приложение: http://localhost:8080/manager/start?path=/myapp и http://localhost:8080/manager/stop?path=/myapp чтобы остановить ваше приложение.Измените /myapp на контекст вашего приложения, и у вас будет контроль запуска / остановки.

Затем вы можете решить проблемы с паролем внутри вашего кода.

В свете вашего разъяснения вы могли бы взглянуть на эта документация tomcat и используйте JMX.Однако даже JMX защищен паролем.Не существует стандарта для доступа к элементам управления контейнером из вашего веб-приложения.

Другие советы

Я пытаюсь подумать, действительно ли / какие другие веб-фреймворки поддерживают это.Я думаю, что Джим сейчас указывает на правильный уровень решения.Независимо от того, какая платформа используется, веб-контейнер должен позволять перезапускать содержащееся в нем веб-приложение.Tomcat потребует, чтобы приложение manager было доступно.Похоже, что (из моего поиска в Google), что Jetty предоставляет эту функциональность через JMX MBeans.Таким образом, функция перезапуска может быть непереносима между контейнерами.

Чтобы сделать это переносимым в любом фреймворке, я думаю, вам нужно было бы выделить, какие вещи необходимы для перезапуска.Если это спящий режим, повторно инициализируйте фабрику сеансов.Если это конфигурация spring, это, безусловно, может быть более навязчивым, но замена или перенастройка компонентов, по-видимому, правильный путь.Если это i18n или markup resources, wicket, я полагаю, уже может помочь с этим.

Я также рекомендую вам взглянуть на JMX.Вы можете отключить аутентификацию для JMX, и в этом случае убедитесь, что порт JMX недоступен из Интернета (отфильтруйте порт на брандмауэре вашего хоста или привяжите его только к локальному IP-адресу).JMX был предназначен для стандартизации удаленного мониторинга и управления приложениями, контейнерами в мире Java EE, поэтому он более или менее обеспечивает инфраструктуру, которую вы ищете.

Или, в качестве альтернативы, используйте другой веб-контейнер (предпочтительно встроенный) и обрабатывайте даже перезапуск контейнера из вашего java-кода.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top