【问题标题】:Get root domain from request从请求中获取根域
【发布时间】:2013-06-18 22:57:01
【问题描述】:

以下面的 URL 为例。 http://www.test1.example.com

有什么方法可以让我得到 "example.com" 作为输出。我知道有一个方法servletrequest.getServerName()。它给我输出 test1.example.com

任何帮助表示赞赏。

【问题讨论】:

    标签: java servlets


    【解决方案1】:

    对于HttpServletRequest request,您可以使用:

     String domain = request.getRequestURL().toString().replace(request.getRequestURI(),"");
    

    【讨论】:

      【解决方案2】:

      HttpServletRequest 中,您可以使用以下方法获取 URI 的各个部分。您还可以使用它们逐段重构 URL(以帮助调试或其他任务),如下所示:

      // Example: http://myhost:8080/people?lastname=Fox&age=30
      
      String uri = request.getScheme() + "://" +   // "http" + "://
                   request.getServerName() +       // "myhost"
                   ":" + request.getServerPort() + // ":" + "8080"
                   request.getRequestURI() +       // "/people"
                  (request.getQueryString() != null ? "?" +
                   request.getQueryString() : ""); // "?" + "lastname=Fox&age=30"
      

      所以request.getServerName() 是我们最接近您需要的。

      “根域”:

      对于“根域”,您必须处理从getServerName() 返回的String。这是必要的,因为 Servlet 无法提前知道您所谓的“主机”或像 .com 这样的域(它可能是您网络中称为 com 的机器 - 而不仅仅是后缀-,谁知道?)。

      对于您提供的模式(三分之一+secondlevel+com/net),以下内容应该可以满足您的需求:

      String domain = request.getServerName().replaceAll(".*\\.(?=.*\\.)", "");
      

      以上将给出以下输入/输出:

      www.test.com       -> test.com
      test1.example.com  -> example.com
      a.b.c.d.e.f.g.com  -> g.com
      www.com            -> www.com
      com                -> com
      

      【讨论】:

      • 感谢您的回复...但在您的示例中,您只有 myhost..当您的 URL 与我在我的问题中提到的包含子域的 URL 相同时,请重新考虑它。
      • @AlexandruRada 问题中的示例仅适用于.com.net 等。对于您想要的,您必须使用:String domain = request.getServerName().replaceAll(".*\\.(?=.*\\..*\\.)", ""));。请注意,同样的方式不适用于.co.uk,这种方式适用于.co.uk(和类似的),但不适用于.com 等。
      • 或使用^[^\.]*\.(.*)$ 删除第一个子域
      • 如果有代理服务器就不行。 request.getServerName() 获取本地代理服务器IP。
      • @AhuraMazda 通常,代理会添加一个标头来指示原始请求的服务器。也许你可以找那个
      【解决方案3】:
      import java.net.InetAddress;
      
      void Func() {
          InetAddress ia = InetAddress.getLocalHost();
          System.out.println (ia.getHostName());
      }
      

      希望这会有所帮助。

      【讨论】:

      • 感谢您的回复,但这个问题基本上是关于如何在 Java 中获取根域,我相信这是针对 JSP 的。
      【解决方案4】:

      我们有更可靠的方法来做同样的事情。有谷歌图书馆“番石榴”。 在您的 pom 中添加以下依赖项。

      <dependency>
           <groupId>com.google.guava</groupId>
           <artifactId>guava</artifactId>
           <version>19.0</version>
      </dependency>
      

      那就试试吧

      InternetDomainName.from("subdomain.example.co.in").topPrivateDomain().toString()
      

      这会给你"example.co.in"

      【讨论】:

        【解决方案5】:

        您可以将其作为简单的字符串操作:

        String A = "http://www.test1.example.com";
        String B = A.substring(A.lastIndexOf('.', A.lastIndexOf('.')-1) + 1);
        

        没有从a.b.c.example.com 获取example.com 的标准方法,因为这样的转换通常没有用处。有些顶级域名不允许在second level 上注册;例如 all .uk domains。给定news.bbc.co.uk,您最终会希望得到bbc.co.uk,对吗?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-07-02
          • 2012-12-02
          • 1970-01-01
          • 2015-05-29
          • 2019-08-10
          • 2019-11-13
          • 2012-07-06
          • 1970-01-01
          相关资源
          最近更新 更多