在restful中重定向的方法:
接口定义:
//重定向到新页面页面
@Path("/openpage/{id}")
@GET
@Consumes(MediaType.APPLICATION_XML)
Response openPage(@PathParam("id")Long id);
实现类:
@Override
public Response openPage(Long pageId, Long storeId) {
try {
URI uri = new URI("http://xxx/xx/openpage/3");
ResponseBuilder builder = Response.status(Response.Status.FOUND).location(uri);// 对应http响应码302
// ResponseBuilder builder = Response.seeOther(uri);// 对应http响应码303
// ResponseBuilder builder = Response.temporaryRedirect(uri);// 对应http响应码307
return builder.build();
} catch (URISyntaxException e) {e.printStackTrace();
}
return null;
}
备注:
1、ResponseBuilder是创建Response的工厂类。
2、location(uri)实际是更新ResponseBuilder。
3、seeOther(uri)、temporaryRedirect(uri)会生成一个新的ResponseBuilder。
4、http协议响应码3XX的含义
HTTP状态码3XX表示重定向,表明浏览器需要执行某些特殊的处理以正确处理请求。
301 Moved Permanently
永久性定向。该状态码表示请求的资源已被分配了新的URI,以后应使用资源现在所指的URI。
302 Found
临时性重定向。该状态码表示请求的资源已被分配了新的URI,希望用户(本次)能使用新的URI访问。和301相似,但302表示的资源不是永久移动,只是临时性的。换句话说,已移动的资源对应的URI将来还有可能发生变化,比如,用户把uri保存为书签,但不会像301状态码出现时那样更新书签,而是仍旧保留返回302状态码的页面对应的uri
303 See Other
该状态码表示由于请求对应的资源存在着另一个URI,应使用GET方法定向获取请求的资源,=,
303和302状态码有着相同的功能,但是303明确表示客户端应当采用get方法获取资源,这点与302状态码有区别。
比如,当使用post方法访问CGI程序,其执行后的处理结果为希望客户端能以get方法重定向到另一个uri上去时,返回303状态码。虽然302也可实现相同的功能,但这里使用302状态码是最理想的。
当301、302、303响应状态码返回时,几乎所有浏览器都会把post改成get,并删除请求报文内的主体,之后请求会自动再次发送。
301、302标准是禁止将post方法改变成get方法的,但实际使用时大家都会这么做。
307 Temporary Redirect
临时重定向。该状态码与302有相同的含义。尽管302标准禁止post变化get,但实际使用时大家不遵守。
307会遵照浏览器标准,不会从post变为get。但是对于处理响应时的行为,各种浏览器有可能出现不同的情况。