Как упоминалось в предыдущем ответе, неплохо иметь некоторый javascript на стороне клиента, чтобы предотвратить дублирование отправки от триггерных счастливых пользователей, однако вы также должны выполнять эту проверку на стороне сервера.
Одним из подходов может быть создание скрытого поля формы с идентификатором GUID, который будет создавать coldfusion при рендеринге вашей формы.
Итак, что-то вроде:
<cfset GUID = createUUID()>
<cfoutput>
<form id="frm" action="/target.cfm" method="post">
<input type="hidden" name="guid" value="#GUID#">
<!-- all your formfields go here -->
<input type="submit">
</form>
</cfoutput>
Затем на стороне сервера целевая страница проверяет, не получила ли она ранее GUID. Есть много способов сделать это, вот два из многих способов.
а) Использовать область сеанса.
Это, вероятно, самый быстрый способ, если вы не работаете в кластерной среде и вам просто нужно что-то быстрое для крошечного приложения.
<cfif isDefined("session.MYPAGE_GUID") AND session.MYPAGE_GUID EQ form.guid>
<cfoutput>Duplicate Form Submission</cfoutput>
<cfabort>
<cfelse>
<cfset session.MYPAGE_GUID = form.guid>
<!-- Do Business Logic Here -->
</cfif>
b) Используйте таблицу базы данных. Создайте таблицу базы данных со столбцом с именем GUID. Убедитесь, что GUID является первичным ключом или имеет уникальное ограничение.
Прежде чем запускать бизнес-логику, вставьте form.GUID в таблицу базы данных. Если вы можете выполнить процесс вставки, ваша бизнес-логика, если нет, запрос к базе данных выдаст ошибку, что запись существует. Затем вы можете перехватить эту ошибку и принять соответствующие меры для дублирования отправки.
Я предпочитаю вариант базы данных, поскольку он работает в кластерных средах, а сервер базы данных надежно защищает от условий гонки, гарантируя, что GUID устанавливается только один раз.
Имейте в виду, что это всего лишь демонстрация основных концепций, а не простое решение. Предстоит еще немного поработать над внедрением этих концепций в решение для электронной коммерции.
person
M.Scherzer
schedule
27.06.2015