Нахождение URL вашего приложения только с ServletContext - PullRequest
48 голосов
/ 24 марта 2009

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

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

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

Ответы [ 5 ]

32 голосов
/ 24 марта 2009

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

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

Редактировать: мой последний пункт повторяет то, о чем говорил Тони.

9 голосов
/ 24 марта 2009

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

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

2 голосов
/ 05 июля 2016

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

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

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

2 голосов
/ 27 октября 2015
0 голосов
/ 27 октября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...