如何从 ExternalContext 获取 webapp 的绝对 URL?

Posted

技术标签:

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

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

【问题讨论】:

【参考方案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();

【讨论】:

以上是关于如何从 ExternalContext 获取 webapp 的绝对 URL?的主要内容,如果未能解决你的问题,请参考以下文章

何时使用 NavigationHandler.handleNavigation 与 ExternalContext.redirect/dispatch

获取访问action的页面信息

如何从 Keras 嵌入层获取词向量

如何从 Flutter 中的 Jitsi Meet Conference 获取视频帧

如何在 node-webkit 中获取工作目录

使用 ISRC 代码从 Spotify API 获取曲目信息