【发布时间】:2013-11-15 19:10:06
【问题描述】:
展示比讲述更容易。这是来自 Apache Tika 网络服务:
在该文件的第 89 行,localhost 是硬编码的:
sf.setProviders(providers);
sf.setAddress("http://localhost:" + TikaServerCli.DEFAULT_PORT + "/");
BindingFactoryManager manager = sf.getBus().getExtension(
BindingFactoryManager.class);
这意味着如果您在本地计算机上运行 Web 服务,则无法通过 http://hostname:9998/tika 或 http://hostname.domain.net:9998/tika 访问它。它必须以http://localhost:9998/tika访问。
我的 Java 非常生锈,但在谷歌搜索后,我添加了几行:
sf.setProviders(providers);
String hostname;
try
{
InetAddress ia = InetAddress.getLocalHost();
hostname = ia.getCanonicalHostName() + ":";
}
catch (Exception e)
{
//I'll do something else with this later
hostname = "http://localhost:";
}
sf.setAddress(hostname + TikaServerCli.DEFAULT_PORT + "/");
BindingFactoryManager manager = sf.getBus().getExtension(
BindingFactoryManager.class);
这允许我通过主机名和 FQDN 访问它,但不能通过 localhost。
有没有一种惯用的方式让 Web 服务以所有可能的形式响应?
- 127.0.0.1(本地访问时)
- localhost(本地访问时)
- 主机名
- FQDN
- IP 地址
- 我还缺少什么
我想我可以在运行时计算和或多或少完整的枚举,但似乎有更好的方法(?)。
【问题讨论】:
-
您是否有理由不直接调用 JAXRS 服务器?只有它有一个真正简单易用的 RESTful API...
-
这个是 JAXRS 服务器。但它只能通过 localhost 地址访问。假设服务器在机器
Foo上运行。我无法从机器Bar上击中它。只有调用 - 使用localhost作为地址 - 从Foo进行的才有效。Bar不能调用Foo,Foo不能使用Foo作为地址调用自己。它会失败。localhost被硬编码到作为 JAXRS 服务器的代码中。你可以在我的第 89 行的 pastebin 链接中看到这个硬编码。 -
我向 Apache 提交了一个错误:issues.apache.org/jira/browse/TIKA-1196
-
啊,对了,现在我明白你了!我认为问题在于它绑定到错误的接口,而不是它正在检查主机名。有关更多信息,请参阅我对错误的评论
-
是的,我看到了,只是在调查它。我会把我的cmets放在那里。
标签: java web-services hostname apache-tika