可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I've got a Tomcat app that is being served up from multiple domains. Previous developers built a method to return the application URL (see below). In the method they request the server name (request.getServerName()
) which, appropriately, returns the ServerName from the httpd.conf file.
However, I don't want that. What I want is the host name that the browser sent the request to, i.e. whichever domain the browser is accessing the application from.
I tried getHeader("Host")
, but that is still returning the ServerName set in the httpd.conf file.
Instead of request.getServerName()
, what should I use to get the server name that the browser sent the request to?
For example:
- ServerName in httpd.conf: www.myserver.net
- User accesses Tomcat app on www.yourserver.net
I need to return www.yourserver.net NOT www.myserver.net. The request.getServerName()
call only seems to return www.myserver.net
/** * Convenience method to get the application's URL based on request * variables. * * @param request the current request * @return URL to application */ public static String getAppURL(HttpServletRequest request) { StringBuffer url = new StringBuffer(); int port = request.getServerPort(); if (port
Thanks in advance!
回答1:
You need to ensure that httpd
passes the Host
header provided by the client to Tomcat. The easiest way (assuming you are using mod_proxy_http
- you didn't say) is with the following:
ProxyPreserveHost On
回答2:
How about using something like I did in this demo JSP ?
appURL is
回答3:
Maybe not related to this question. If you are using tomcat, you can specify any Host string in the request header, even javascript like
Then it could be shown on the page.:
host name is :
So you need to verify it before using it.
回答4:
This is indeed very problematic because sometimes you don't even know where the host that you expect to be a fully qualified domain has been removed. @rickz provided a great solution, but here's another one that I consider to be more complete and covers many different urls:
Basically, you strip the protocol (http://, https://, ftp://,...) then the port (should it exist) and then the whole URI. That gives you the complete list of top level domain and subdomains.
String requestURL = request.getRequestURL().toString(); String withoutProtocol = requestURL.replaceAll("(.*\\/{2})", "") String withoutPort = withoutProtocol.replaceAll("(:\\d*)", "") String domain = withoutPort.replaceAll("(\\/.*)", "")
I did this in scala using inline method definitions, but the code above is more verbose because I found it better to post the solution in pure java. So if you create methods for this you could chain them to do something like this:
removeURI(removePort(removeProtocol(requestURL)))