ModelAndView не перенаправляет, но дает правильный ответ

У меня есть следующая функция, которая делает запрос:

function postIngredient(action, options) {
    var xhr = new XMLHttpRequest();
    xhr.open(options.method, action, true);
    xhr.setRequestHeader('Content-Type', 'application/json; charset=UTF-8');
    xhr.setRequestHeader(options.security.header, options.security.token);

    // send the collected data as JSON
    xhr.send(JSON.stringify(options.params));

    xhr.onloadend = function () {
        // done
    };
}

Функция запускает метод на сервере, который в основном возвращает объект ModelAndView:

...   
ModelAndView mav = new ModelAndView("redirect:/recipies/edit?id=1");  
....  
return mav;  

После успешного выполнения почтового запроса выполняется следующий запрос GET: введите здесь описание изображения

Итак, на вкладке «Предварительный просмотр» запроса у меня есть правильная страница, на которую он должен перенаправить, но в браузере нет перенаправления. Страница остается той же, на которой изначально была вызвана функция postIngredient(). Как тогда можно было сделать редирект?


person Cristian    schedule 14.04.2017    source источник


Ответы (1)


Вы делаете запрос ajax через объект XMLHttpRequest из Javascript. На этот запрос отвечает перенаправление, и объект XMLHttpRequest следует за перенаправлением, вызывает редактирование, а затем результат этого (полное содержимое страницы для страницы редактирования) отправляется вашему методу xhr.onloadend(). Само окно браузера в этом не участвует и не знает, что внутри было отправлено перенаправление.

Если вы хотите сохранить сообщение как запрос xhr и не переключаться на стандартную форму-сообщение, вы можете изменить свой метод обработки поста, чтобы просто вернуть строку:

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ResponseBody;

@ResponseBody
public ResponseEntity<String> myPostProcessingIngredientsMethod(..put args here...) {
  ... do something ...
  return new ResponseEntity<>("/recipies/edit?id=1", HttpStatus.OK));
}

Затем в вашем коде Javascript, где вы выполняете запрос xhr, получите строку результата из данных результатов и перенаправьте свой браузер на что-то вроде

window.location.href = dataFromResult;

Аннотация @ResponseBody не позволяет Spring интерпретировать возвращенную строку как имя представления, а упаковка строки в ResponseEntity дает вам возможность возвращать коды ошибок, если что-то пойдет не так.

person P.J.Meisch    schedule 15.04.2017
comment
Работает как шарм. Спасибо за объяснение и решение. - person Cristian; 15.04.2017