Получение URL-адреса в контексте webapp (базовый URL) - программирование

Получение 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("/")));

Будут ли два вышеупомянутых метода давать одинаковый результат?

4b9b3361

Ответ 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.