Tomcat: getHeader(“Host”) vs. getServerName()

匿名 (未验证) 提交于 2019-12-03 10:24:21

问题:

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))) 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!