我有一个Web应用程序。 无论何时部署,都会启动一个servlet。 servlet一旦启动,就必须将其自身注册为外部服务的回调URL,以获取一些通知。 注册回调可能只是对外部服务的简单POST请求,请求正文中包含回调URL。
我进行了大量搜索,但找不到有关如何在servlet中构造回调URL的任何方法。
例如 如果将应用程序部署为protocol://A.B.C.D:XXXX,并且servlet路径为/ myservlet,则回调网址将变为protocol://A.B.C.D:XXXX / myservlet
我不确定如何在Servlet代码中获取IP地址(A.B.C.D)和端口号(XXXX)。 有人可以帮忙吗?
请注意,应该在servlet启动后尽快在init()中完成此操作,因此我没有HTTPServletRequest对象来获取此信息。
Servlet通常无法(而且可能不应该)知道其运行的主机。 IMO,您将需要一些外部配置。
没有请求,您如何获得该请求的URL? 正如Sotirios所说,没有办法。
注意,如果您希望在容器启动后立即运行代码,则应使用ServletContextListner,而不是Servlet的init方法。 仅当实例化servlet时才调用该init。 更多信息stackoverflow.com/questions/13819773/
即使这样,我如何获得部署应用程序的机器地址和端口?
除非正在处理请求,否则无法通过Servlet API获得所需的信息。各个容器可能具有特定于容器的API,使您能够执行此操作,但是您生产的任何产品都无法移植。
我相信servlet网址映射始终是固定的!因为您已经将其发布在web.xml中
如果它不是固定的,则可以从类路径中读取web.xml并获取它。
Java中的[这里是读取XML的方法]
之后,您可以使用@ColdHack的答案获取服务器IP。
现在您有了IP和servlet名称,您可以构造URL并将其发布到外部服务。
您可以在上下文侦听器中完成所有这些操作,这样每次启动时,它都会注册自己。
它更像是一种拙劣的方式,然后是一个直接的解决方案
要获取服务器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()。
基于此主题,您可以执行以下操作来获取服务器端口:
public void doGet(ServletRequest request, ServletResponse response) {
System.out.println("Host Name =" + request.getServerName());
System.out.println("Port Number =" + request.getServerPort());
}