Spring MVC 2.5 - Как добавить параметры для перенаправления, которые не отображаются в URL? - PullRequest
1 голос
/ 16 августа 2011

Для простоты, основные функции моего приложения - это интерфейс поиска с формой для результатов поиска. Приложение получает эти результаты через SOAP из другого приложения.

В поисковом контроллере мне нужна возможность указать некоторые параметры в перенаправлении, которые не будут отображаться в URL страницы результатов, и другие, которые будут отображаться. Вот пример того, как выглядит перенаправление:

return new ModelAndView(new RedirectView(/results?q=blah, true));

Как видите, мне нужно включить параметр q. Но мне также нужны другие параметры, которые я не хочу отображать на странице результатов URL.

Мое приложение нуждается в возможности выполнять несколько поисков в течение одного сеанса браузера. Например, наличие нескольких вкладок для поиска одновременно. Таким образом, объект сеанса абстрагируется, чтобы содержать карту объектов состояния сеанса. Они содержат данные о состоянии для каждого поиска. Новое состояние сеанса создается каждый раз, когда делается запрос к контроллеру поиска. Это состояние сеанса затем выбирается контроллером результатов.

Наш процесс закладки должен быть полностью свободным от состояния. Таким образом, человек должен иметь возможность добавить URL страницы результатов в закладки или скопировать и вставить ее в новую вкладку или другой браузер. Когда выполняется URL-адрес результатов, контроллер результатов выполняет новый поиск.

Моя проблема заключается в следующем: Мне нужен способ, чтобы контроллер результатов мог узнать, исходит ли запрос от перенаправления в контроллере поиска или от (закладки / копирования и вставки). Таким образом, он может получить существующие данные о состоянии сеанса или выполнить новый поиск. Если я могу передать скрытый параметр в редиректе из контроллера поиска, например, «запросчик», то я могу использовать простую логику в контроллере результатов для поиска существующего состояния сеанса или запуска нового поиска.

Спасибо

РЕДАКТИРОВАТЬ: Как насчет передачи данных с одного контроллера на другой, не помещая их в URL. Например, доступ к данным модели, переданным из перенаправления контроллера поиска в контроллер результатов вместо представления результатов? Вот конструктор с возможностью скрыть атрибуты модели.

/**
 * Create a new RedirectView with the given URL.
 * @param url the URL to redirect to
 * @param contextRelative whether to interpret the given URL as
 * relative to the current ServletContext
 * @param http10Compatible whether to stay compatible with HTTP 1.0 clients
 * @param exposeModelAttributes whether or not model attributes should be
 * exposed as query parameters
 */
public RedirectView(String url, boolean contextRelative, boolean http10Compatible, boolean exposeModelAttributes)

Есть ли другой способ передачи данных с одного контроллера на другой?

Ответы [ 2 ]

1 голос
/ 16 августа 2011

Ответ HTTP-перенаправления, обычно обозначаемый кодом ответа 301 , содержит в своем заголовке Location URI, который клиент должен запросить, чтобы найти указанный ресурс. Нет другого способа сообщить клиенту что-либо о запросе, который нужно сделать, только URI, который он должен запросить. Поэтому только те вещи, которые могут быть переданы в URI, могут быть отправлены обратно в редирект. Можно сделать некоторые предположения на основе заголовка Referer , но это не гарантия.

0 голосов
/ 16 августа 2011

Рассматривали ли вы просто вызов второго обработчика из текущего обработчика?Как то так:

public ModelAndView currentHandler(...)
{
  ModelAndView returnValue;

  ... stuff here...
  if (make a decision)
  {
    returnValue = ... set the model and view as normal.
  }
  else
  {
    returnValue = ClassName.someOtherHandler( ... parameters ... );
  }

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