Как получить абсолютный URL-адрес webapp из ExternalContext?

Я пытаюсь получить корневой URL-адрес веб-приложения из ExternalContext, но не могу понять, какой метод использовать...

Ответы

Ответ 1

Вы можете получить ExternalContext из FacesContext и извлечь 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();

источник

Ответ 2

Более краткий способ:

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

Тогда вам не нужно возиться с опущением портов, когда схема http и порт 80 и т.д.

Ответ 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();