Рассмотрим следующий код, отправляющий клиенту HTTP-ответ «201»:
String url = "/app/things?id=42"; // example
response.setStatus(HttpServletResponse.SC_CREATED);
response.setContentType("text/plain");
response.setHeader("Location", url);
response.getWriter().print(url);
Он информирует клиента о том, что была создана новая «вещь» и что ее можно найти по URL-адресу /app/things?id=42
.Проблема в том, что этот URL является относительным.Это было бы идеально для JSP, который можно записать следующим образом:
<img src="<c:url value="/things?id=42" />" />
, который будет производить следующий HTML:
<img src="/app/things?id=42" />
Что мы хотим для веб-приложений.
Но я не верю, что это то, что мы хотим для заголовка местоположения с ответом 201.Спецификация HTTP сообщает :
14.30 Местоположение
Поле заголовка ответа Location используется для перенаправления получателя в местоположение, отличное от Request-URI длязавершение запроса или идентификация нового ресурса.Для 201 (Создано) ответов, Местоположение - это то, что нового ресурса, который был создан запросом.Для ответов 3xx местоположение ДОЛЖНО указывать предпочитаемый URI сервера для автоматического перенаправления на ресурс.Значение поля состоит из одного абсолютного URI.
Location = "Location" ":" absoluteURI
Например:
Location: http://www.w3.org/pub/WWW/People.html
Мой вопрос заключается в том, как преобразовать этот относительный URL-адрес в абсолютный URL-адрес дляРасположение заголовка в правильном порядке для сервлетов.
Я НЕ верю, что использование:
request.getServerName() + ":" + request.getServerPort() + url;
является правильным решением.Должен быть стандартный метод, обеспечивающий корректный вывод (чтобы можно было переписать URL и т. Д.).Я не хочу создавать хак.