2013-10-02 104 views
2

我有一個web應用程序。無論何時部署,都會啓動一個servlet。一旦servlet啓動,它必須將自己註冊爲一個回調url到外部服務以取回一些通知。註冊一個回調可能只是一個簡單的POST請求,通過請求正文中的回調url進行外部服務。 我搜索了很多,但無法找到如何在servlet中構造回調URL的任何方法。
例如如果應用程序部署爲協議:// ABCD:XXXX和servlet路徑是/myservlet然後回調URL將成爲協議:// ABCD:XXXX/myservlet
我不知道如何讓名稱IP地址(ABCD)和端口號(XXXX)在servlet代碼中。任何人都可以幫忙嗎?
請注意,應該在servlet啓動後儘快完成,可能在init()中,因此我沒有HTTPServletRequest對象來獲取此信息。在servlet中獲取當前的應用程序url

+3

Servlet通常不能知道它運行的主機是什麼(也可能不應該)。國際海事組織,你需要一些外部配置。 –

+1

如果沒有請求,你如何獲得該請求的URL?正如Sotirios所說,沒辦法。 –

+0

請注意,如果您希望代碼在容器啓動後儘快運行,那麼您可以使用ServletContextListner,而不是servlet的init方法。如果該servlet是實例化的,那麼只會調用該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; 
    } 

要獲得servlet的名字,你可以在你的servlet使用getServletName()

基於this話題,你可以做到這一點,以獲得服務器端口:

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

我相信servlet的URL映射始終是固定的!因爲你已經在web.xml中發佈了這個文件。

如果它不是固定的,你可以從classpath中讀取web.xml並獲取它。

[以下是如何讀個XML]在java中

還有以後你可以用@ ColdHack的回答來獲取服務器的IP。

現在您已經擁有IP和servlet名稱,您可以構建URL並將其發佈到外部服務。

您可以在上下文偵聽器中執行所有這些操作,每次啓動時都會自行註冊。

+0

它更像是一種簡單的解決方法 –

相關問題