【问题标题】:Getting current application url in servlet在 servlet 中获取当前应用程序 url
【发布时间】:2023-03-17 04:50:01
【问题描述】:

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

【问题讨论】:

  • 一个 Servlet 通常不能(也可能不应该)知道它在哪台主机上运行。 IMO,你需要一些外部配置。
  • 没有请求,你怎么能得到那个请求的 URL?正如 Sotirios 所说,不可能。
  • 注意,如果您想在容器启动后立即运行代码,您应该使用 ServletContextListner,而不是 servlet 的 init 方法。仅当 servlet 被实例化时才会调用该 init。更多信息stackoverflow.com/questions/13819773/…
  • 即便如此我将如何获得应用程序部署的机器地址和端口?

标签: java servlets


【解决方案1】:

除非正在进行请求,否则无法通过 Servlet API 获得您要查找的信息。单个容器可能具有容器特定的 API,可让您执行此操作,但您生成的任何内容都无法移植。

【讨论】:

    【解决方案2】:

    要获取服务器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());
    }
    

    【讨论】:

      【解决方案3】:

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

      如果不固定,可以从classpath中读取web.xml并获取。

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

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

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

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

      【讨论】:

      • 这更像是一种 hacky 方式而不是直接的解决方案
      猜你喜欢
      • 2012-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多