2014-01-31 16 views
7

Ich habe eine Webanwendung, die Benutzer auf ihren eigenen Java-Webservern (z. B. Tomcat) bereitstellen. Die Java-Seite der Webanwendung muss die URL der Webanwendung selbst melden (z. B. http://aServer.com:8080/MyApp oder https://blah.blahSever/MyApp). Da jedoch eine Reihe von Benutzern Portweiterleitungen und andere Netzwerktechniken verwendet, meldet die Webanwendung häufig den falschen Namen.So erhalten Sie den Servernamen in einer Java-Webanwendung

Ich habe die folgenden Techniken ausprobiert, aber oft produzieren sie nicht das, was der Benutzer benötigt.

Note (Anfrage ist ein HttpServletRequest)

request.getLocalAddr(); // Returns: 127.0.0.1 
request.getLocalName(); // Returns: localhost 
request.getServerName(); // Returns: localhost 
request.getServerPort(); // Returns: 8080 
request.getContextPath(); // Returns: /MyApp 

request.getScheme();  // Returns: http 

InetAddress.getLocalHost().getHostName();   // Returns: serverXXX-XXX-XXX-XX.xxxx-xxxxxxx.net 
InetAddress.getLocalHost().getHostAddress();  // Returns: xxx.xxx.xxx.xxx (ip address) 
InetAddress.getLocalHost().getCanonicalHostName(); // Returns: serverXXX-XXX-XXX-XX.xxxx-xxxxxxx.net 

Die Verwendung von InetAddress nahe kommt, was ich will, aber da wir Server-Aliase und Proxypass in unserem Apache2-Server verwenden, wird der Wert von InetAddress ist die Ist-Werte des Servers statt der Alias.

Die einzige Technik, die ich mir vorstellen kann, ist, dass der Benutzer eine Eigenschaft in einer Eigenschaftendatei bereitstellt, die die Webanwendung beim Start liest. Wenn die Eigenschaft festgelegt ist, wird mit diesem Wert der vollständige Webanwendungspfad zurückgegeben (z. B. serverUrl = https://blah.blahServer/MyApp). Diese Technik würde funktionieren, erfordert jedoch mehr Bereitstellungsarbeit für meine Kunden.

Hat jemand irgendwelche Ideen, wie ich eine elegantere Lösung erreichen kann?

Danke, Phil

+1

Setzen Sie die Adresse in eine Systemeigenschaft und verwenden Sie diese. Wenn Sie es auf einen anderen Server legen, ändern Sie die Eigenschaft. Veranlassen Sie, dass die App den Start verweigert, wenn die Eigenschaft nicht festgelegt ist. – Kayaman

+0

Haben Sie 'request.getRequestURL()' ausprobiert? –

+0

@Mustafa Genc - Leider gibt getRequestUrl einfach zurück: http: // localhost: 8080/MyApp/- das ist nett und vollständig (es enthält http und den Port und den Namen der Web App), aber leider gibt "localhost" zurück! – Phil

Antwort

5

Überprüfen Sie die 'Gastgeber' Request-Header. Die meisten Clients fügen diesen Header hinzu, um den Host anzugeben, mit dem sie Kontakt aufnehmen möchten.

Dies ist die gleiche Kopfzeile, die für VirtualHosts verwendet wird, also ist es ziemlich Standard. Es ist auch obligatorisch in HTTP1.1-Anfragen.

In der Tat können Sie den Wert nicht rein von der Serverseite erhalten, da es möglich ist, dass der Benutzer seinen eigenen Hostnamen für Ihren Server definiert hat.

request.getHeader("Host") 

Wenn Ihr Server hinter einem Apache-Reserve-Proxy ist, verwenden Sie die ProxyPreserveHost Richtlinie sicher, dass der Host machen Header intakt gehalten. Ich bin sicher, dass andere Reverse-Proxies ähnliche Optionen haben.

+0

Ich versuchte getHeader ("Host") und es gibt einfach "localhost: 8080" zurück. Ich möchte wirklich eine Lösung, die nicht beinhaltet, die Kunden zu informieren, dass sie ihren Apache, Proxies, was auch immer ändern müssen. Ich denke, wonach ich (in Bezug auf Pure Java) frage, ist eigentlich unmöglich. – Phil

+0

Wenn der Client Ihnen nicht den Hostnamen sendet, mit dem er Sie kontaktiert hat, können Sie ihn nicht kennen, da er sich je nach Client unterscheiden kann. Natürlich, wenn Sie einen kanonischen Namen definieren wollen, dann ist es anders, und Sie sollten einfach eine Konfigurationseigenschaft verwenden (viele Apps machen das so). Wie für den localhost, überprüfen Sie mit Firebug (oder ähnlich), welcher Header in der Anfrage gesendet wurde. Wenn es wirklich localhost ist, bedeutet das irgendwie, dass Ihr Browser Ihren Hostnamen mit localhost umgestellt hat, oder natürlich, Sie haben 'localhost' in der URL verwendet :) –

+1

Der 'host' Anfrage Header ist unsicher zu benutzen, da er von jedem geändert werden kann – deiga

0

Ich denke, dein Problem ist nicht die Java API, um auf die Werte zuzugreifen, die du brauchst.

In Katers gibt es zum Beispiel eine Datei server.xml ein Paar Zeilen wie

<Engine name="Catalina" defaultHost="**localhost**"> 

<Host name="**localhost**" appBase="webapps" ... 

enthält, wenn Sie localhost mit dem gewünschten Namen wie „myhost.com“ ersetzen und den Host, auf dem Tomcat läuft weiß seine eigenen Hostnamen, dann, wenn Sie die uRL mit dem angegebenen Hostnamen abrufen, wird es den Namen, den Sie fragen zeigen für

Grüße

0

dies das Problem für mich gelöst:

InetAddress.getLocalHost().getHostName(); 
Verwandte Themen