我正在开发一个使用Jersey的网络应用。我正在尝试使用URIBuilder和seeOther响应实现一个post-post-post类的东西。目的是重定向到浏览器已经使用的相同URI,但强制执行GET。它有点像这样:
应该发生的事情是浏览器选择303 See Other并对其收到的URI执行GET。不幸的是,正在发生的是它在URI上执行PUT(据我所知)并且PUT将其发送回上面的步骤1.导致重定向循环。
任何想法在这里出了什么问题?
private Response giveSeeOther(){
/*Get the base URI builder*/
final UriBuilder uriBuilder = m_uriInfo.getBaseUriBuilder();
/* Some stuff to create the URI */
final Map<String, Object> parameterMap = new HashMap<String, Object>();
parameterMap.put("uid", getUid());
final URI redirectUri = uriBuilder.path(SomeObject.class).
path(SomeObject.class, "get").
buildFromMap(parameterMap);
/* See Other (303) */
return Response.seeOther(redirectUri).build();}
这是看其他方法的代码。我不确定您可能想看到的其他代码,但请告诉我。
答案 0 :(得分:8)
您需要使用301 HTTP响应代码。
通过使用303,您的POST请求得以维护,并相应地重定向。使用301,您的请求将通过GET“永久移动”。
对于可能想知道为什么有人想要这样做的其他读者,这是为了防止用户使用他们的网络浏览器的“重新加载”功能多次提交他们的POST数据(这些用户经常遇到“腐烂的通信”问题do)重新加载可能没有完全加载的“谢谢”页面。
提示:当您以这种方式重定向时,如果您没有使用Cookie来确保信息进入“谢谢”页面,那么您需要以相同的方式向您的请求添加一个或多个参数定期GET表格会。例如,如果订单ID号是82838,您可以将其传递到您的“谢谢”页面,如下所示:
http://www.example.com/order/thank-you.pl?orderid=82838
这有明显的潜在安全问题,通过让您的“谢谢”页面代码在显示订单状态之前检查订单ID实际属于当前登录用户(我假设您希望包括在“谢谢”页面上订购状态信息 - 在这种情况下,如果它是在短期内发展的东西,那么包括“刷新”按钮{或链接}以供用户检查订单状态也是很好的。一些步骤。)
我希望这对你有所帮助。