Jersey - 使用Get not Put重定向,导致重定向循环

时间:2009-08-07 16:15:36

标签: java http redirect jersey

我正在开发一个使用Jersey的网络应用。我正在尝试使用URIBuilder和seeOther响应实现一个post-post-post类的东西。目的是重定向到浏览器已经使用的相同URI,但强制执行GET。它有点像这样:

  1. 请求来自PUT
  2. 处理PUT请求
  3. 查看其他回复
  4. 应该发生的事情是浏览器选择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();}
    

    这是看其他方法的代码。我不确定您可能想看到的其他代码,但请告诉我。

1 个答案:

答案 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实际属于当前登录用户(我假设您希望包括在“谢谢”页面上订购状态信息 - 在这种情况下,如果它是在短期内发展的东西,那么包括“刷新”按钮{或链接}以供用户检查订单状态也是很好的。一些步骤。)

我希望这对你有所帮助。