有人可以建议我使用REST在以下两种方式中重定向URL的最佳方法是:
1. httpResponse.sendRedirect("URL");
2. Response.temporaryRedirect(new URI("path"));
答案 0 :(得分:10)
根据RFC 7231,HTTP / 1.1的语义和内容的当前引用,有several types of redirects。他们都是
指示资源可能在a处可用的重定向 不同的URI,由Location字段提供,如 状态代码
301
(永久移动),302
(已找到)和307
(临时重定向)。重定向,提供各种匹配资源的选择 能够表示原始请求目标,如在
300
(多项选择)状态代码。重定向到由位置标识的其他资源 字段,可以表示对请求的间接响应,如 在
303
(请参阅其他)状态代码中。- 醇>
重定向到之前缓存的结果,如
304
(不是 修改)状态代码。
正确的一个取决于您的需求。但是,这些是最常见的:
301
(永久移动)状态代码表示目标 资源已被分配一个新的永久URI和任何未来 对此资源的引用应该使用其中一个附带的URI。 [...]
303
(请参阅其他)状态代码表示服务器是 将用户代理重定向到不同的资源,如a所示 Location头字段中的URI,用于提供 对原始请求的间接响应。 [...]
307
(临时重定向)状态代码表示目标 资源临时驻留在不同的URI和用户代理之下 如果它执行自动,则不得更改请求方法 重定向到该URI。 [...]
根据您在问题中发布的代码,我相信您使用的是JAX-RS API。如果是这样,您可以执行以下重定向:
URI uri = ...
return Response.status(Status.MOVED_PERMANENTLY).location(uri).build();
URI uri = ...
return Response.seeOther(uri).build();
URI uri = ...
return Response.temporaryRedirect(uri).build();
有关详细信息,Response
类文档可能很有用。
您还可以在REST端点中注入UriInfo
:
@Context
UriInfo uriInfo;
获取一些有用的信息,例如base URI和absolute path of the request。在构建重定向URI时非常有用。
具有重定向的资源方法如下:
@Path("/foo")
public class MyEndpoint {
@Context
private UriInfo uriInfo;
@POST
@Produces(MediaType.APPLICATION_JSON)
public Response myMethod() {
URI uri = uriInfo.getBaseUriBuilder().path("bar").build();
return Response.temporaryRedirect(uri).build();
}
}
答案 1 :(得分:6)
有许多形式的重定向。 3xx
系列HTTP状态代码包含:
301 Moved Permanently
307 Temporary Redirect
这些和其他代码具有不同的语义。哪个是对的,取决于你的情况。资源是否已永久移至新位置?或者重定向只是暂时的?