Решил проблему, изменив сигнатуру метода контроллера.
Ранее MultipartHttpServletRequest был в сигнатуре метода. Когда весна возвратилась из двустороннего входа в систему, она попыталась вызвать этот метод с обычным HttpServletRequest, и потерпела неудачу.
@RequestMapping(value = "/xxx", method = RequestMethod.POST)
public ModelAndView doAmlCheckPost(MultipartHttpServletRequest req) {
UserInfo currentUserInfo = UserInfo.getCurrentUserInfo(req);
MultipartFile someFile = req.getFile("someFile");
Исправление заключается в использовании обычного RequestMapping и получении файлов с URL-адреса. Если запрос не является экземпляром MultipartHttpServletRequest - перенаправить на метод GET, который снова отображает форму
@RequestMapping(value = "/xxx", method = RequestMethod.POST)
public ModelAndView doAmlCheckMultipartPost(HttpServletRequest req, @RequestParam(value = "someFile", required = false) MultipartFile someFile) {
if(!(req instanceof MultipartHttpServletRequest)){
return "redirect:/xxx";
}
Итак, процесс теперь выглядит следующим образом:
- запросить форму: GET / someform
- заполните многочастную форму
- перезагрузите сервер или удалите JSESSIONID
- отправьте форму: POST / someform (с многокомпонентными данными) ЧТО ПРОИЗОЙДЕТ, ЧТО ЗДЕСЬ ЗАПРОС СОХРАНЯЕТСЯ В СЕССИИ, НО НЕТ СПОСОБА СОХРАНЕНИЯ МНОГООБРАЗНЫХ ДАННЫХ, ЭТО ДВОЙНОЙ И НЕ МОЖЕТ БЫТЬ СЕРИАЛИЗОВАНО
- пользователь перенаправлен на экран входа в систему
- после входа в систему пользователь перенаправляется на форму: GET / someform
- spring пытается повторно опубликовать сохраненную форму (я думаю, что она использует DefaultSavedRequest). SPRING NOW вызывает метод POST с помощью HttpServletRequest, а не MultipartHttpServletRequest. Мы обнаруживаем, что это не MultipartHttpServletRequest и перенаправляем на страницу GET, снова отображая форму для пользователя