Джерси - перенаправление с использованием Get Not Put вызывает петлю перенаправления - PullRequest
5 голосов
/ 07 августа 2009

Я работаю над веб-приложением, которое использует Джерси. Я пытаюсь реализовать что-то вроде пост-пост-поста, используя URIBuilder и ответ seeOther. Цель состоит в том, чтобы перенаправить на тот же URI, к которому уже подключен браузер, но вызвать GET. Это работает примерно так:

  1. Запрос приходит через PUT
  2. Запрос PUT обработан
  3. См. Другой ответ возвращен

Что должно случиться, так это то, что браузер подхватывает 303 См. Другое и выполняет GET для получаемого им URI. К сожалению, происходит то, что вместо этого он выполняет PUT для URI (насколько я могу судить) и 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 Ответ

8 голосов
/ 12 сентября 2009

Вместо этого вам нужно использовать код ответа 301 HTTP.

Используя 303, ваш запрос POST поддерживается и перенаправляется соответственно. Используя 301, ваш запрос будет «перемещен навсегда» через GET.

Для других читателей, которые могут задаться вопросом, почему кто-то хочет сделать это, это запретить пользователю отправлять свои данные POST более одного раза с помощью функции «Обновить» своего веб-браузера (что часто вызывает проблемы с «гнилыми сообщениями») сделать), чтобы перезагрузить страницу с благодарностью, которая, возможно, не была загружена полностью.

Подсказка: если вы перенаправите таким образом, если вы не используете куки-файлы для обеспечения того, что информация попадает на вашу страницу "спасибо", вам нужно добавить один или несколько параметров в ваш запрос таким же образом, обычная форма GET будет. Например, если идентификационный номер заказа 82838, вы можете передать его на страницу с благодарностью:

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

Существуют очевидные потенциальные проблемы безопасности, которые легко решаются с помощью проверки кода вашей страницы «спасибо», что идентификатор заказа действительно принадлежит текущему зарегистрированному пользователю, прежде чем он отобразит статус заказа (я полагаю, вы хотите включить Информация о статусе заказа на этой странице «спасибо» - в этом случае также полезно включить кнопку «Обновить» {или ссылку}, чтобы пользователь мог проверить статус заказа, если это происходит в течение короткого периода времени. ряд шагов).

Надеюсь, это полезно для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...