Обработка повторной отправки формы в Spring MVC
В последнем примереSpring MVC form handling, если вы обновите представление об успешном завершении формы, большинство браузеров предложат всплывающее диалоговое окно для подтверждения повторной отправки формы. Если вы нажмете «да», форма будет повторно отправлена снова, этот сценарий известен как дублированная отправка формы.
Рисунок: пример отправки дублированной формы.
Распространенным решением этой проблемы является использование шаблона проектирования «Post/Redirect/Get». Он будет перенаправлен на другой URL, если отправка формы прошла успешно, вместо того, чтобы возвращать веб-страницу напрямую.
Note
Проверьте подробное объяснениеPost/Redirect/Get Design Pattern in Wiki.
Post/Redirect/Get Design Pattern in Spring MVC
В этом руководстве мы покажем вам, как применить шаблон проектирования «Post/Redirect/Get» в Spring MVC для решения проблемы отправки дублированной формы в примереlast form handling.
1. Повторная отправка формы
См. Ниже нормальное объявление формы, которое решает проблему с дублированием формы.
Файл: mvc-dispatcher-servlet.xml
/WEB-INF/pages/ .jsp
В приведенном выше фрагментеCustomerController
напрямую возвращает представление «CustomerSuccess», которое вместо этого должно бытьreplace with a redirect URL.
2. Вид перенаправления
Объявлено представление обзора с именем «customerSuccessRedirect» и возвращение URL-адреса «CustomerSuccess.htm».
Файл: spring-views.xml
3. Конфигурация пружины
Обновите настройкиmvc-dispatcher-servlet.xml, чтобы связать всю конфигурацию Spring вместе.
-
Обновите «successView» до нового представления перенаправления с именем «customerSuccessRedirect».
-
Объявите «XmlViewResolver» для загрузки представления перенаправления.
-
Установите порядок приоритета для «InternalResourceViewResolver» и «XmlViewResolver», в противном случае «InternalResourceViewResolver» всегда будет совпадать, и ваше приложение не сможет вызвать «XmlViewResolver» .
-
Объявите контроллер «ParameterizableViewController», чтобы он соответствовал URL-адресу перенаправления и возвращал представление пользователю. Поскольку «ControllerClassNameHandlerMapping» не сгенерирует сопоставление для любого встроенного контроллера Spring, вам необходимо определить явное сопоставление в «SimpleUrlHandlerMapping».
Файл: mvc-dispatcher-servlet.xml
customerSuccessController /WEB-INF/pages/ .jsp /WEB-INF/spring-views.xml
4. Как это устроено?
1. URL доступа:http://localhost:8080/SpringMVC/customer.htm.
2. Заполните и отправьте форму.
3. Верните «successView», то есть «customerSuccessRedirect».
4. «XmlViewResolver» соответствует ему и возвращает «RedirectView» с URL-адресом «CustomerSuccess.htm».
5. «SimpleUrlHandlerMapping» соответствует ему и возвращает ParameterizableViewController, «customerSuccessController», и возвращает имя представления «CustomerSuccess».
customerSuccessController
6. «InternalResourceViewResolver» соответствует ему и возвращает окончательное представление «/WEB-INF/pages/CustomerSuccess.jsp».
/WEB-INF/pages/ .jsp
7. URL изменен наhttp://localhost:8080/SpringMVC/CustomerSuccess.htm.
8. Попробуйте обновить страницу формы успеха, диалоговое окно повторной отправки формы больше не будет отображаться.
Note
Общая концепция - вернуть URL-адрес перенаправления вместо прямой страницы.
Скачать исходный код
Скачать -SpringMVC-Duplicated-Form-Submission-Solution.zip (12 КБ)