Как запросить контейнер сервлета для получения эффективного URL из ServletContextListener? - PullRequest
1 голос
/ 12 декабря 2011

В дополнение к этот вопрос есть ли способ получить эффективный URL-адрес определенной страницы в том же контейнере из области действия ServletContextListener?

Немного предыстории, зачем мне это нужно:

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

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

Я настроил простой ServletContextListener, который запускает поток для опроса той же страницы через заданный интервал, и я могу сохранить данные в файлы, которые затем я смогу прочитать позже.

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

Итак ... Как я могу получить эту информацию программно и упростить жизнь бедным сокам, внедряющим приложение позже!

Ответы [ 2 ]

4 голосов
/ 13 декабря 2011

Возможно, но это не красиво и привязывает вас к конкретному контейнеру.Короче говоря, это что-то вроде хака, YMMV.Решение ниже будет работать для Jetty.

В контексте contextInitialize вы можете получить доступ к WebAppContext следующим образом:

public void contextInitialized(ServletContextEvent sce) {
    WebAppContext ctx = (WebAppContext) sce.getServletContext();
    System.out.println("context Base Path" + ctx.getContextPath());
    System.out.println("Getting the port is a bit trickier");
    System.out.println("One valid Port = " + ctx.getServer().getConnectors()[0].getPort());
}

Я удалил некоторые проверки и проверки, чтобы быть кратким, но этого должно быть достаточно, чтобы получитьИдея ... добавить повязку по своему вкусу.

Здесь вы можете получить разные ответы с разными исполнениями.Так как цель состоит в том, чтобы вызвать службу, это не имеет большого значения, если мы получим исходные объявления или псевдоним, что означает, что вызов успешен.

Наконец, поскольку целевой IP-адрес известен (localhost), поскольку рабочий потокв той же JVM, что и целевой адрес, и путь к сервису известен, как только я попаду в нужный контекст, все, что нам нужно, это знать корневой порт порта и контекста.

Если вы попробуете это и получитеПроблемы, пожалуйста, отредактируйте ответ или оставьте комментарии, чтобы мы могли извлечь выгоду из вашего опыта.

1 голос
/ 12 декабря 2011

Не уверен, как это сделать через API.

Но если вы можете позволить себе сделать это лениво , то я бы хотел установить фильтр, который просматривает первый запроскоторый приходит, извлекает используемый порт / сервер и делает эту информацию доступной в области приложения.

Ваш ServletContextListener может затем извлечь его оттуда?

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

...