¿Cuál es la forma correcta de configurar el encabezado de ubicación para una respuesta HTTP 201 en una aplicación Java Servlet

Considere el siguiente código enviando una respuesta HTTP 201 "Creado" al cliente:

    String url = "/app/things?id=42"; // example
    response.setStatus(HttpServletResponse.SC_CREATED);
    response.setContentType("text/plain");
    response.setHeader("Location", url);
    response.getWriter().print(url);

Informa al cliente que se creó una nueva "cosa" y que se puede encontrar en la URL/app/things?id=42. El problema es que esta URL es relativa. Esto sería perfecto para un JSP, que podría escribirse de la siguiente manera:

<img src="<c:url value="/things?id=42" />" />

Que produciría el siguiente HTML:

<img src="/app/things?id=42" />

¿Qué es lo que queremos para las aplicaciones web?

Pero no creo que eso sea lo que queremos para un encabezado de ubicación de respuesta 201. La especificación HTTP estados:

14.30 Ubicación

El campo de encabezado de respuesta de ubicación se utiliza para redirigir al destinatario a una ubicación que no sea el URI de solicitud para completar la solicitud o identificar un nuevo recurso. Para 201 respuestas (creadas), la ubicación es la del nuevo recurso que fue creado por la solicitud. Para las respuestas 3xx, la ubicación DEBE indicar el URI preferido del servidor para la redirección automática al recurso. El valor del campo consta de un único URI absoluto.

       Location = "Location" ":" absoluteURI

Un ejemplo es:

       Location: http://www.w3.org/pub/WWW/People.html

Mi pregunta es cómo traduzco esa URL relativa a la URL absoluta para el encabezado Ubicación de la manera adecuada para los servlets.

NO creo que usando:

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

Es la solución correcta. Debe haber un método estándar que produzca la salida correcta (para poder aplicar la reescritura de URL, etc.). No quiero crear un hack.

Respuestas a la pregunta(5)

Su respuesta a la pregunta