Подтвердить что ты не робот

Поиск URL вашего приложения только с помощью ServletContext

Я пишу веб-приложение Java с помощью Spring MVC. У меня есть фоновый процесс, который проходит через базу данных и находит уведомления, которые должны быть отправлены по электронной почте моим пользователям. Эти сообщения электронной почты должны включать гиперссылки в приложение. Это похоже на довольно распространенный шаблон для веб-приложения, но у меня проблемы.

Как получить полный URL моего приложения с именем сервера и контекстом? У меня нет доступа к каким-либо из методов в HttpServletRequest, потому что я запускаю это как фоновый процесс, а не в ответ на веб-запрос. Лучшее, что я могу сделать, это получить доступ к ServletContext.

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

4b9b3361

Ответ 1

Не рекомендуется динамически составлять URL-адрес во время выполнения, особенно на основе ServletRequest. Это связано прежде всего с тем, что вы не знаете URL, который пользователи будут использовать для доступа к приложению - сервер приложений может находиться за веб-сервером, брандмауэром или балансировщиком нагрузки. Чтобы не допустить его, нельзя прогнозировать сетевые топологии.

Ваша текущая методика получения URL-адреса из файла свойств достаточно хороша, чтобы разрешить указанную проблему. Возможно, вам стоит взглянуть на предоставление административной консоли для управления URL-адресом, появляющимся в почтовых сообщениях, особенно если есть консоль администратора на месте или имеются связанные параметры, которые должны входить в один.

Изменить: Моя последняя точка повторяет то, о чем говорил Тони.

Ответ 2

Почему просто нет веб-страницы установки, которая появляется при первом запуске приложения, если файл конфигурации не существует (например, в папке WEB-INF. С помощью ServletContext вы можете вызвать getRealPath и получить реальный путь Файл и посмотреть, существует ли он(). Если это так, переадресовать на стартовую страницу приложения, если это не так, откройте страницу администрирования).

Лучшее, что вы делаете с ServletContext, читаете некоторые настройки из web.xml и получаете путь к контексту, только HttpRequest может предоставить вам URL FQ.

Ответ 3

Servlet 2.5 добавил getContextPath() в ServletContext. Обновление версий зависимостей EE определенно должно решить вашу проблему.

Подробнее здесь:

Ответ 4

Я думаю, вы можете использовать что-то вроде:

String host = InetAddress.getLocalHost().getCanonicalHostName();
String appUrl = String.format("http://%s:%s%s", host, port, contextPath);

с портом и contextPath из ServletContext.

Ответ 5

Вы проверили с помощью отладчика, если ваш ServletContext не является экземпляром HttpServletContext? Если да, бросьте его и получите информацию оттуда.