2

我有一个网络应用程序。无论何时部署它,都会启动一个 servlet。一旦 servlet 启动,它必须将自己注册为外部服务的回调 url 以获取一些通知。注册回调可能只是对外部服务的简单 POST 请求,请求正文中包含回调 url。我进行了很多搜索,但找不到任何关于如何在 servlet 中构造回调 url 的方法。
例如,如果应用程序部署为协议://ABCD:XXXX并且 servlet 路径是/myservlet,那么回调 url 将成为协议://ABCD:XXXX/myservlet
不确定如何获取IP 地址(ABCD)和端口号(XXXX ) 在 servlet 代码中。任何人都可以在这里帮忙吗?
请注意,它应该在 servlet 启动后立即完成,可能在 init() 中,因此我没有 HTTPServletRequest 对象来获取此信息。

4

3 回答 3

1

除非正在进行请求,否则您正在查找的信息无法通过 Servlet API 获得。单个容器可能具有容器特定的 API,使您能够做到这一点,但您生产的任何东西都不会是可移植的。

于 2013-10-02T16:26:59.003 回答
-1

我相信 servlet url 映射总是固定的!因为您已经在 web.xml 中发布了它

如果它不固定,您可以从类路径中读取 web.xml 并获取它。

[这里是如何读取 XMLs] 在 java

之后您可以使用@ColdHack 的答案来获取服务器 IP。

现在您有了 IP 和 servlet 名称,您可以构建 URL 并将其发布到外部服务。

您可以在上下文侦听器中完成所有这些操作,这样每次启动时,它都会自行注册。

于 2013-10-02T20:14:16.460 回答
-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 名称,您可以getServletName()在 servlet 上使用。

基于主题,您可以执行以下操作来获取服务器端口:

public void doGet(ServletRequest request, ServletResponse response) {
    System.out.println("Host Name = " + request.getServerName());
    System.out.println("Port Number = " + request.getServerPort());
}
于 2013-10-02T16:42:50.370 回答