Каков наилучший способ избежать повторной подачи формы в Spring. Предоставляет ли эта структура какие-либо специальные функции для решения этой проблемы (например, как токен синхронизатора в Struts)?
Повторная подача формы в Spring
Ответ 1
Существуют разные способы избежать двойных представлений, которые можно комбинировать:
-
Используйте JavaScript для
disable
кнопки через несколько секунд после клика. Это позволит избежать нескольких попыток, вызванных нетерпением пользователей, нажав несколько раз на кнопку. -
Отправить перенаправление после отправки, это называется шаблон Post-Redirect-Get (PRG). Это позволит избежать множественных подач, вызванных пользователями, нажимающими F5 на странице результатов, и игнорирование браузера, предупреждающее о том, что данные будут повторно отправлены или перемещаться взад и вперед с помощью кнопок браузера/вперед и игнорирования того же предупреждения.
-
Создайте уникальный токен при запросе страницы и введите как область сеанса, так и скрытое поле формы. Во время обработки проверьте, есть ли токен, а затем немедленно удалите его из сеанса и продолжите обработку. Если токена там нет, то блокируйте обработку. Это позволит избежать вышеупомянутых проблем.
В Spring вы можете использовать RedirectView
как реализацию шаблона PRG (как описано в пункте 2). Остальные две точки должны быть реализованы сами.
Ответ 2
эта страница, кажется, отвечает на ваш вопрос (для маркерной проблемы, я имею в виду. javascript и post-redirect-get части вопроса здесь не рассматриваются):
http://explodingjava.blogspot.com/2009/03/spring-mvc-synchronizer-token.html
Ответ 3
Просто сделайте перенаправление после публикации. После успешной подачи формы при возврате вашего ModelAndView убедитесь, что представление представляет собой RedirectView. От пользователя POV они отправляют форму, а затем перенаправляются, чтобы сделать "GET" на другой URL. Таким образом, они не будут дважды подчиняться.
Обратите внимание, что при использовании представления переадресации атрибуты модели отображаются в URL как параметры. Таким образом, вы можете захотеть сохранить атрибуты как можно более тонкие. То, что я обычно делаю, - это показать пользователю страницу, которая на самом деле не содержит никакой уникальной информации, просто сообщение "подтвердить".