【发布时间】:2011-06-29 22:58:28
【问题描述】:
考虑以下代码向客户端发送 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 响应 Location 标头。 HTTP 规范states:
14.30 地点
Location 响应头字段用于将接收者重定向到 Request-URI 以外的位置,以完成请求或识别新资源。对于 201(已创建)响应,位置是请求创建的新资源的位置。对于 3xx 响应,位置应该指示服务器的首选 URI,用于自动重定向到资源。字段值由单个绝对 URI 组成。
Location = "Location" ":" absoluteURI一个例子是:
Location: http://www.w3.org/pub/WWW/People.html
我的问题是如何以正确的方式将相对 URL 转换为 Location 标头的绝对 URL。
我不相信使用:
request.getServerName() + ":" + request.getServerPort() + url;
是正确的解决方案。应该有一个产生正确输出的标准方法(以便可以应用 URL 重写等)。我不想创建一个 hack。
【问题讨论】:
标签: java http servlets http-headers httpresponse