Как правильно установить заголовок Location для ответа HTTP 201 в приложении Java Servlet

Рассмотрим следующий код, отправляющий клиенту ответ 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, который можно было бы записать следующим образом:

" />

В результате получился бы следующий HTML:


Это то, что мы хотим для веб-приложений.

Но я не верю, что это то, что мы хотите получить ответ 201 Location header. В спецификации HTTP указано :

14.30 Местоположение

Поле заголовка ответа Location используется для перенаправления получателя в местоположение, отличное от Request-URI, для завершения запроса или идентификации нового ресурс. Для 201 (Созданного) ответа Местоположение - это местоположение нового ресурса, который был создан по запросу. Для ответов 3xx расположение ДОЛЖНО указывать предпочтительный URI сервера для автоматического перенаправления на ресурс. Значение поля состоит из одного абсолютного URI.

  Location = "Location" ":" absoluteURI

Пример:

  Местоположение: http://www.w3.org/pub/WWW/People.html

Мой вопрос в том, как мне преобразовать этот относительный URL в абсолютный URL для заголовка Location надлежащим образом для сервлетов.

Я НЕ верю, что использование:

request.getServerName() + ":" + request.getServerPort() + url;

является правильным решением. Должен быть стандартный метод, обеспечивающий правильный вывод (чтобы можно было применить перезапись URL и т. Д.). Я не хочу создавать взлом.

35
задан oberlies 27 August 2014 в 11:56
поделиться