У меня есть страница check, где я добавляю flashAttribute("error","Test message"); и возвращаю RedirectView на страницу login.
@RequestMapping(value = "/login")
public ModelAndView mainPage(Model model){
System.out.println(" - " + model.asMap().get("error") + " - "); //-> - null -
return new ModelAndView("/login");
}
@RequestMapping(value = "/check")
public View checkLogin(RedirectAttributes redirectAttributes,
@RequestHeader(value = "username", required = false)String username,
@RequestHeader(value = "password", required = false)String password){
redirectAttributes.addFlashAttribute("error", "Test message");
return new RedirectView("/login");
}
Эта строка: model.asMap().get("error") вернуть null. Как я могу справиться RedirectAttributes?




Думаю, это может вам помочь.
@RequestMapping(value = "/login")
public ModelAndView mainPage(RedirectAttributes redirectAttrs){
Map<String> attributesMap = redirectAttrs.getFlashAttributes();
return new ModelAndView("/login");
}
@RequestMapping(value = "/check")
public View checkLogin(RedirectAttributes redirectAttributes,
@RequestHeader(value = "username", required = false)String username,
@RequestHeader(value = "password", required = false)String password){
redirectAttributes.addFlashAttribute("error", "Test message");
return new RedirectView("/login");
}
Надеюсь это поможет
Это не работает. Но я думаю, что проблема в сессии. Как сказал М. Дейнум. Вот моя проблема с сеансом stackoverflow.com/questions/56648205/…
конечно, перенаправление возвращает запрос клиенту с сущностью в заголовке http для запроса другого пути к ресурсам. Поскольку во время настройки нового запроса информация старого запроса удаляется, вы теряете атрибуты, если не сохраняете их в модели/сессино. Я думаю, это указано в ссылке, которую я добавил. Может быть, посмотрите, как работает перенаправление на стороне клиента.
Я решил свою проблему с помощью сеанса. Вы можете посмотреть здесь, если вам интересно. Но проблема с чтением flashAttribute осталась. Даже с вашим ответом я все еще не понимаю flashAttributes. redirectAttrs.getFlashAttributes() пуст, даже если сеанс тот же.
Ok. почему вы используете RedirectView в качестве возвращаемого параметра? Мне кажется, вы хотите перенаправить на другой ресурс той же службы. Таким образом, вы можете использовать переадресацию вместо перенаправления, и вы можете использовать ModelAndView в качестве возвращаемого типа. Поэтому, возможно, попробуйте: return new ModelAndView("forward:/login"), возможно, посмотрите здесь baeldung.com/spring-redirect-and-forward Как вы можете видеть в пункте 5, перенаправление использует совершенно новый запрос, а перенаправление пересылает тот же запрос без изменений.
Я использую RedirectView, потому что redirect:/page перенаправляет на неправильный URL. Мое приложение работает на сервере Tomcat, например mydom.com/myapp/. Но с Apache в качестве обратного прокси-сервера он работает напрямую на mydom.com/. Когда я использую redirect:/page, он перенаправляет на mydom.com/myapp/page, что является недействительной ссылкой. RedirectView перенаправляет на mydom.com/page, что правильно. forward:/page — это перенаправление, которое меняет страницу, но URL не меняется на /page
По той же причине у вас это. Атрибуты флэш-памяти хранятся в сеансе, вы где-то теряете сеанс, поэтому атрибуты флэш-памяти отсутствуют. Исправьте одно, и оно исправит другое.