I think the problem is that a host doesn't necessarily know its name - especially if its behind a firewall or router or load balancer or edge caching technology or whatever.
It can know its own name, but that name may have nothing to do with how a client browser would address it.
For example, I can do a ping of
www.yahoo.com and get something like this (some stuff deleted):
$ ping
www.yahoo.com PING
www.yahoo.akadns.net (66.218.71.81) ...
64 bytes from w2.scd.yahoo.com (66.218.71.81): ...
64 bytes from w2.scd.yahoo.com (66.218.71.81): ...
Now if you were coding the yahoo server, which host name would you want:
www.yahoo.com, www.yahoo.akadns.net, or w2.scd.yahoo.com or any of the who knows how many others that are out there serving yahoo content?
And maybe you have one server hosting requests from several different names.
So maybe lazily initialize it off the first request. Hopefully that request is not going to be an admin
testing with
http://localhost/ So maybe its even better to query each request for "how did you get here" information.
Anyway, back to your question, if you still want the host name, how about
java.net.InetAddress.getLocalHost().getHostName()
or .getCanonicalHostName() (JDK 1.4).