2013-10-02 1 views
2

У меня есть веб-приложение. Всякий раз, когда он развертывается, запускается сервлет. Как только сервлет запускается, он должен регистрироваться как URL-адрес обратного вызова для внешней службы, чтобы вернуть некоторые уведомления. Регистрация обратного вызова может быть простым запросом POST для внешней службы с URL-адресом обратного вызова в теле запроса. Я много искал, но не смог найти способ построения обратного вызова в сервлете.
, например. если приложение развертывается как протокол: // ABCD: XXXX и путь сервлет /myservlet затем обратного вызова URL станет протокол: // ABCD: XXXX/myservlet
Я не уверен, как получить Ipaddress (ABCD) и номер порта (XXXX) в коде сервлетов. Может ли кто-нибудь помочь здесь?
Обратите внимание, что это должно быть сделано, как только начинается сервлет, возможно, в init(), поэтому у меня нет объекта HTTPServletRequest, чтобы получить эту информацию.Получение текущего URL-адреса приложения в сервлете

+3

Сервлет не может вообще (и, вероятно, не должен) знать, на каком хост-компьютере он работает. ИМО, вам понадобится внешняя конфигурация. –

+1

Без запроса, как вы можете получить этот URL-адрес этого запроса? Как сказал Сотириос, никоим образом. –

+0

Обратите внимание, что если вы хотите, чтобы код запускался, как только контейнер запускает вас, используйте ServletContextListner, а не метод init для сервлета. Этот init будет вызван только в том случае, если сервлет будет вызван. Дополнительная информация http://stackoverflow.com/questions/13819773/how-to-run-specific-java-code-on-tomcat-start-or-on-application-deploy – polypiel

ответ

1

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

-1

Чтобы получить IP-адрес сервера, вы можете использовать это:

public String getServerIpAdd() 
    { 
     String ipAddr = ""; 
     try 
     { 
      InetAddress inetAddr = InetAddress.getLocalHost(); 
      byte[] addr = inetAddr.getAddress(); 
      // Convert to dot representation   
      for (int i = 0; i < addr.length; i++) { 
       if (i > 0) { 
        ipAddr += "."; 
       } 
       ipAddr += addr[i] & 0xFF; 
      }    
     } catch (UnknownHostException e) { 
      System.out.println("Host not found: " + e.getMessage()); 
     } 
     return ipAddr; 
    } 

Чтобы получить имя сервлета, вы можете использовать getServletName() на сервлет.

Основываясь на this тему, вы можете сделать это, чтобы получить порт сервера:

public void doGet(ServletRequest request, ServletResponse response) { 
    System.out.println("Host Name = " + request.getServerName()); 
    System.out.println("Port Number = " + request.getServerPort()); 
} 
-1

Я считаю, что отображение сервлета URL всегда фиксирована! поскольку вы уже опубликовали это в web.xml

В случае, если это не исправлено, вы можете прочитать web.xml из пути к классам и получить его.

[Вот как читать XMLs] в Java

И там после того, как вы можете использовать @ ответ ColdHack, чтобы получить IP-адрес сервера.

Теперь у вас есть имя IP и сервлета, вы можете создать URL-адрес и POST его для внешней службы.

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

+0

Это скорее хакерский путь, чем прямое решение –

Смежные вопросы