使用JSTL如何从URL中获取域名?

8

我正在尝试使用JSTL从URL中获取域名。我知道的两种方法都返回错误的信息。我需要准确地获取URL中的内容。

当我执行以下操作时:

${pageContext.request.remoteHost}

我获取了我的服务器的IP地址。

当我执行以下操作时:

${pageContext.request.serverName}

我通常能够获取正确的域名,但在我们在亚马逊上的服务器上,它返回的是“server1”,而不是正确的域名,可能是因为它处理多个域名的方式不同。

有人知道如何获取URL中当前的域名吗?

我可能需要获取URL并解析它。我该怎么做?

4个回答

14
你应该使用ServletRequest#getLocalName()而不是ServletRequest#getServerName()。它返回服务器的真实主机名,而ServletRequest#getServerName()确实会返回在Host头中设置的值。
${pageContext.request.localName}

就这些了。其他答案中提出的解决方案都很笨拙和hacky。


顺便说一下,ServletRequest#getRemoteHost()并不会返回服务器的主机名,而是客户端的主机名(或者在主机名无法立即解析时返回IP)。当你同时在同一台机器上运行Web服务器和Web浏览器时,它显然与服务器所使用的主机名相同。如果你对服务器的IP感兴趣,请使用ServletRequest#getLocalAddr()。术语“本地”和“远程”必须从服务器的角度进行解释,而不是从客户端的角度进行解释。毕竟,所有Java代码运行的地方是服务器。


localName在这里返回127.0.0.1。原因似乎是我使用了一个Web服务器作为Jetty的穿透代理。 - koppor

2
你可以从URL中解析域名。 或者
 public static String getDomainName(String url)
    {
         URL u;
         try {
             u = new URL(url);
         } 
         catch (Exception e) { 
             return "";
         }
         return u.getHost();
    }

好的,这就是我需要知道如何做的事情。也许我需要更好地解释我的问题。我应该如何获取URL并解析它? - Mechlar

1

-3

${pageContext.request.contextPath}


上下文路径不是主机名。 - Fordi
这是Web应用程序/当前上下文的名称。 - Timo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接