Получение URL-адреса в контексте webapp (базовый URL)
Иногда вам нужно создать полный URL-адрес вашего контекста веб-приложения внутри сервлета/JSP/на основе HttpServletRequest
.
Что-то вроде http://server.name:8080/context/. API-интерфейс Servlet не имеет единого метода для достижения этого.
Прямым подходом является добавление всех компонентов URL к StringBuffer
, например
ctxUrl = sb.append(req.getScheme()).append("://")
.append(req.getgetServerName()).append(":")
.append(req.getServerPort()) etc
Интересно, если что-то не так с этой альтернативой (что в 10 раз быстрее):
ctxUrl = req.getRequestURL();
ctxUrl = ctxUrl.substring(0, ctxUrl.lastIndexOf("/")));
Будут ли два вышеупомянутых метода давать одинаковый результат?
Ответы
Ответ 1
Он назвал "базовый URL" (тот, который вы могли бы использовать в теге HTML <base>
). Вы можете получить его следующим образом:
StringBuffer url = req.getRequestURL();
String uri = req.getRequestURI();
String ctx = req.getContextPath();
String base = url.substring(0, url.length() - uri.length() + ctx.length()) + "/";
Ваш подход ctxUrl.substring(0, ctxUrl.lastIndexOf("/")));
не удастся по URL-адресам с несколькими папками, такими как http://server.name:8080/context/folder1/folder2/folder3
.
См. также:
Ответ 2
Ниже вы получите URL-адрес контекста и разрешите его соответствующим образом.
URI contextUrl = URI.create(req.getRequestURL().toString()).resolve(req.getContextPath());
Это сделает всю необходимую обработку для портов, косых черт, а что нет. Он также будет работать для корневого контекста, поскольку req.getContextPath() вернет ""
Если вы используете прокси-сервер, вам необходимо убедиться, что исходный запрос Host:
передан (например, инструкции Apache ProxyPass на ProxyPreserveHost
.