Подтвердить что ты не робот

Повторная подача формы в Spring

Каков наилучший способ избежать повторной подачи формы в Spring. Предоставляет ли эта структура какие-либо специальные функции для решения этой проблемы (например, как токен синхронизатора в Struts)?

4b9b3361

Ответ 1

Существуют разные способы избежать двойных представлений, которые можно комбинировать:

  • Используйте JavaScript для disable кнопки через несколько секунд после клика. Это позволит избежать нескольких попыток, вызванных нетерпением пользователей, нажав несколько раз на кнопку.

  • Отправить перенаправление после отправки, это называется шаблон Post-Redirect-Get (PRG). Это позволит избежать множественных подач, вызванных пользователями, нажимающими F5 на странице результатов, и игнорирование браузера, предупреждающее о том, что данные будут повторно отправлены или перемещаться взад и вперед с помощью кнопок браузера/вперед и игнорирования того же предупреждения.

  • Создайте уникальный токен при запросе страницы и введите как область сеанса, так и скрытое поле формы. Во время обработки проверьте, есть ли токен, а затем немедленно удалите его из сеанса и продолжите обработку. Если токена там нет, то блокируйте обработку. Это позволит избежать вышеупомянутых проблем.

В Spring вы можете использовать RedirectView как реализацию шаблона PRG (как описано в пункте 2). Остальные две точки должны быть реализованы сами.

Ответ 3

Просто сделайте перенаправление после публикации. После успешной подачи формы при возврате вашего ModelAndView убедитесь, что представление представляет собой RedirectView. От пользователя POV они отправляют форму, а затем перенаправляются, чтобы сделать "GET" на другой URL. Таким образом, они не будут дважды подчиняться.

Обратите внимание, что при использовании представления переадресации атрибуты модели отображаются в URL как параметры. Таким образом, вы можете захотеть сохранить атрибуты как можно более тонкие. То, что я обычно делаю, - это показать пользователю страницу, которая на самом деле не содержит никакой уникальной информации, просто сообщение "подтвердить".