5

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

  1. 请求通过 PUT 进入
  2. PUT 请求已处理
  3. 参见返回的其他响应

应该发生的是浏览器选择 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();}

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

4

1 回答 1

8

您需要改用 301 HTTP 响应代码。

通过使用 303,您的 POST 请求得到维护,并相应地重定向。通过使用 301,您的请求将通过 GET “永久移动”。

对于其他可能想知道为什么有人要这样做的读者,这是为了防止用户通过使用他们的网络浏览器的“重新加载”功能(有“烂通信”问题的用户经常这样做)来多次提交他们的 POST 数据。重新加载可能尚未完全加载的“谢谢”页面。

提示:当您以这种方式重定向时,如果您没有使用 cookie 来确保信息到达您的“谢谢”页面,那么您需要以与常规 GET 表单相同的方式向您的请求添加一个或多个参数将要。例如,如果订单 ID 号是 82838,您可以将其传递到“谢谢”页面,如下所示:

http://www.example.com/order/thank-you.pl?orderid=82838

这有明显的潜在安全问题,可以通过让您的“谢谢”页面代码在显示订单状态之前检查订单 ID 实际上属于当前登录的用户来轻松解决(我假设您希望包含订单状态信息在那个“谢谢”页面上——在这种情况下,最好包含一个“刷新”按钮{或链接},以便用户检查订单状态,如果它是在短期内进行的一些事情脚步)。

我希望这对你有帮助。

于 2009-09-12T16:28:59.747 回答