【发布时间】:2011-07-06 10:41:40
【问题描述】:
我正在尝试从 ExternalContext 检索 Web 应用程序的根 URL,但不知道要使用哪种方法...
【问题讨论】:
我正在尝试从 ExternalContext 检索 Web 应用程序的根 URL,但不知道要使用哪种方法...
【问题讨论】:
更简洁的方式是:
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) 不是强制性的。某些非常特殊的情况是否需要它?
您可以从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();
【讨论】:
这是我发现的最简单的方法,它不涉及对 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();
}
【讨论】:
我有一个类似于 BalusC 的:
FacesContext context = FacesContext.getCurrentInstance();
HttpServletRequest request = (HttpServletRequest)context.getExternalContext().getRequest();
String requestURL = request.getRequestURL().toString();
String url = requestURL.substring(0, requestURL.lastIndexOf("/"));
【讨论】:
让我重新表述一下 Jigar 的回答:
final ExternalContext ectx = context.getExternalContext();
String url = ectx.getRequestScheme()
+ "://" + ectx.getRequestServerName()
+ ":" + ectx.getRequestServerPort()
+ "/" + ectx.getRequestContextPath();
【讨论】: