2013-11-15 100 views
0

显示比告诉更容易。这是从Apache提卡Web服务:Java Web服务只响应本地主机,而不是主机名(Apache Tika)

http://pastebin.com/jrCsVVtt

在该文件的89行,本地主机是硬编码:

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

这意味着,如果你在运行Web服务您的本地机器,您无法通过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来访问它,而不是通过本地主机。

有没有一种地道的方式让Web服务响应所有可能的形式?

  • 127.0.0.1(当本地访问)
  • 本地主机(当本地访问)
  • 主机名
  • FQDN
  • IP地址
  • 不管我缺少

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

+0

您是否有直接调用JAXRS服务器的原因?只有它有一个非常简单易用的RESTful API ... – Gagravarr

+0

这是* JAXRS服务器。但它只能通过本地主机地址访问。假设服务器在“Foo”机器上运行。我无法从机器“酒吧”中找到它。只有调用 - 使用'localhost'作为地址 - 由'Foo'制作的才能工作。 'Bar'不能调用'Foo','Foo'不能用'Foo'作为地址来调用它自己。它会失败。 'localhost'被硬编码到JAXRS服务器的代码中。你可以在第89行的我的pastebin链接中看到这个硬编码。 – rianjs

+1

我向Apache提交了一个bug:https://issues.apache.org/jira/browse/TIKA-1196 – rianjs

回答

1

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

更多细节,以及补丁,可以在吉拉票中找到:

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

1

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

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

  2. 编辑nginx的的c​​onf文件:

    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; 
        } 
    } 
    
+0

我喜欢这个想法,但我可以问,你为什么要把发动机放在Tika的前面? –

0

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

现在,您可以选择要将您的端口绑定到哪个所有接口。您的服务器将可以从绑定接口连接到的网络中的所有机器访问。例如。如果您选择将您的服务器端口绑定到回送接口和以太网接口,那么您的服务器将只能从局域网上的计算机和本地主机访问。如果你还有一个WIFI接口,并且你的服务器端口没有绑定到它,那么wifi上的机器将无法访问你的服务器。

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

相关问题