Java Web服务仅响应localhost,而不是主机名(Apache Tika)

时间:2013-11-15 19:10:07

标签: java web-services hostname apache-tika

展示比告诉更容易。这来自Apache Tika网络服务:

http://pastebin.com/jrCsVVtt

在该文件的第89行,localhost是硬编码的:

sf.setProviders(providers);
sf.setAddress("http://localhost:" + TikaServerCli.DEFAULT_PORT + "/");
BindingFactoryManager manager = sf.getBus().getExtension(
                                BindingFactoryManager.class);

这意味着,如果您在本地计算机上运行网络服务,则无法通过http://hostname:9998/tikahttp://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地址
  • 我还缺少什么

我想我可以在运行时计算和或多或少完整的枚举,但似乎可能有更好的方法(?)。

3 个答案:

答案 0 :(得分:1)

我提交了一个补丁,它添加了一个可选的命令行参数,并更改了默认行为以侦听所有有效的主机名和IP。 (这种新的默认行为是否仍有待观察。)

更多细节以及补丁可以在Jira票上找到:

https://issues.apache.org/jira/browse/TIKA-1196

答案 1 :(得分:1)

尝试nginx作为前端服务器,它将请求代理到Tika(Jetty)服务器。

  1. 在运行的Tika服务器所在的服务器上安装nginx。

  2. 编辑nginx配置文件:

    vim /etc/nginx/conf.d/default.conf
    
  3. 设定:

    # The address or IP on which your Tika server is running. I choose port 9998.
    upstream your_domain_or_ip {
        server localhost:9998;
    }
    
    # The nginx server instance
    server {
       listen 80;
       server_name localhost;
    
       # Pass the request with corrent headers to the Tika server
       location / {
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_set_header Host $http_host;
         proxy_set_header X-NginX-Proxy true;
         proxy_pass http://your_domain_or_ip/;
         proxy_redirect off;
       }
    }
    

答案 2 :(得分:0)

系统有几个网络接口 - 包括硬件(如以太网卡)和软件(如带有特殊IP 127.0.0.1的环回接口)。使用localhost时,您的服务器仅将您的端口绑定到环回接口,因此您只能从该接口上的计算机访问它,并且环回接口在其网络上只有一台计算机,而这是您的计算机本身。

现在,您可以选择要将端口绑定到的所有接口。您可以从绑定接口所连接的网络中的所有计算机访问您的服务器。例如。如果您选择将服务器端口绑定到环回接口和以太网接口,则只能从LAN上的计算机和本地主机访问您的服务器。如果您还有一个WIFI接口,并且您的服务器端口未绑定到它,则WiFi上的计算机将无法访问您的服务器。

现在,如果您想将服务器端口绑定到所有可用接口,以便可以从任何地方访问它,那么您需要指定一个特殊的IP - 0.0.0.0而不是localhost或127.0.0.1。请参阅此内容以了解网络接口 - http://wilddiary.com/list-ip-addresses-in-java/