или другие странности. Кроме этого, я не думаю, что это намного лучше, чем манипуляции со строками.
отрим следующий код, отправляющий клиенту ответ 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-адрес для заголовка Location для сервлетов.
Я НЕ верю, что с помощью:
request.getServerName() + ":" + request.getServerPort() + url;
Это правильное решение. Должен быть стандартный метод, обеспечивающий корректный вывод (чтобы можно было переписать URL и т. Д.). Я не хочу создавать хак.