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