【问题标题】:How to get an absolute URL of webapp from ExternalContext?如何从 ExternalContext 获取 webapp 的绝对 URL?
【发布时间】:2011-07-06 10:41:40
【问题描述】:

我正在尝试从 ExternalContext 检索 Web 应用程序的根 URL,但不知道要使用哪种方法...

【问题讨论】:

    标签: java jsf jsf-2


    【解决方案1】:

    更简洁的方式是:

    HttpServletRequest request = (HttpServletRequest) externalContext.getRequest();
    String url = request.getRequestURL().toString();
    String baseURL = url.substring(0, url.length() - request.getRequestURI().length()) + request.getContextPath() + "/";
    

    那么当方案是http 和端口是80 等等时,你就不必费心省略端口了。

    【讨论】:

    • 在这种情况下,我们失去了“上下文路径”
    • 抱歉,您的问题没有涵盖。只需添加+ request.getContextPath()。我会更新答案。
    • 我认为,这里request.getRequestURI().substring(0).substring(0) 不是强制性的。某些非常特殊的情况是否需要它?
    • @Tiny:我认为这是原始答案的剩余部分。我更新了答案。
    【解决方案2】:

    您可以从FacesContext 中获取ExternalContext,然后从外部上下文中提取request

    String file = request.getRequestURI();
    if (request.getQueryString() != null) {
       file += '?' + request.getQueryString();
    }
    URL reconstructedURL = new URL(request.getScheme(),
                                   request.getServerName(),
                                   request.getServerPort(),
                                   file);
    reconstructedURL.toString();
    

    source

    【讨论】:

      【解决方案3】:

      这是我发现的最简单的方法,它不涉及对 URL 各个部分的神秘字符串操作。它似乎适用于所有情况,包括不同的协议和端口。

      String getAbsoluteApplicationUrl() throws URISyntaxException {
              ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
              HttpServletRequest request = (HttpServletRequest) externalContext.getRequest();
              URI uri = new URI(request.getRequestURL().toString());
              newUri = new URI(uri.getScheme(), null,
                      uri.getHost(),
                      uri.getPort(),
                      request.getContextPath().toString(),null, null);
              return newUri.toString();
       }
      

      【讨论】:

        【解决方案4】:

        我有一个类似于 BalusC 的:

        FacesContext context = FacesContext.getCurrentInstance();
        HttpServletRequest request = (HttpServletRequest)context.getExternalContext().getRequest();
        String requestURL = request.getRequestURL().toString();
        String url = requestURL.substring(0, requestURL.lastIndexOf("/"));
        

        【讨论】:

          【解决方案5】:

          让我重新表述一下 Jigar 的回答:

          final ExternalContext ectx = context.getExternalContext();
          String url = ectx.getRequestScheme()
            + "://" + ectx.getRequestServerName()
            + ":" + ectx.getRequestServerPort()
            + "/" + ectx.getRequestContextPath();
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-09-09
            • 1970-01-01
            • 2012-08-27
            • 1970-01-01
            • 2015-01-02
            • 2021-05-17
            相关资源
            最近更新 更多