Qual é a maneira correta de definir o cabeçalho Location para uma resposta HTTP 201 em um aplicativo Java Servlet

Considere o seguinte código enviando uma resposta HTTP 201 "Criada" para o 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 ao cliente que uma nova "coisa" foi criada e que pode ser encontrada na URL/app/things?id=42. O problema é que esse URL é relativo. Isso seria perfeito para um JSP, que pode ser escrito da seguinte maneira:

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

O que produziria o seguinte HTML:

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

Qual é o que queremos para aplicativos da web.

Mas não acredito que seja isso que queremos para um cabeçalho de localização com 201 respostas. A especificação HTTPestados:

14.30 Localização

O campo Localização do cabeçalho de resposta é usado para redirecionar o destinatário para um local que não seja o URI do Pedido para concluir a solicitação ou identificação de um novo recurso. Para 201 respostas (Criadas), o Local é o do novo recurso criado pela solicitação. Para respostas 3xx, o local DEVE indicar o URI preferido do servidor para redirecionamento automático para o recurso. O valor do campo consiste em um único URI absoluto.

       Location = "Location" ":" absoluteURI

Um exemplo é:

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

Minha pergunta é como eu traduzo esse URL relativo para o URL absoluto do cabeçalho Location da maneira correta para servlets.

Eu não acredito que usando:

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

É a solução correta. Deve haver um método padrão que produza a saída correta (para que a reescrita da URL etc. possa ser aplicada). Eu não quero criar um hack.

questionAnswers(5)

yourAnswerToTheQuestion