Мы сталкиваемся с бесчисленным количеством форм в Интернете каждый день, а также видим, что большинство из них не запрещают пользователям отправлять одну и ту же форму несколько раз. Отсутствие таких ограничений иногда может привести к неожиданным результатам, например, к повторным подпискам на почтовые сервисы или повторному голосованию. Возможно, некоторые новички в ASP не знают, как ограничить повторную отправку одной и той же формы в приложениях ASP, поэтому здесь я познакомлю вас с простым методом, позволяющим запретить пользователям отправлять одну и ту же форму несколько раз в течение текущего сеанса в приложениях ASP.
Эта работа в основном состоит из четырех подпрограмм. В более простых приложениях вам нужно только поместить эти коды во включенные файлы для прямого использования, для более сложных сред мы даем некоторые предложения по улучшению в конце статьи.
1. Основной рабочий процесс
Ниже мы по очереди обсудим эти четыре подпрограммы.
(1) Инициализация
Здесь нам необходимо сохранить две переменные в объекте Session, среди которых:
⑴ Каждая форма соответствует уникальному идентификатору, называемому FID, и для того, чтобы сделать это значение уникальным, используется счетчик.
⑵ При успешной отправке формы ее FID должен быть сохранен в объекте Dictionary.
Мы используем специальный процесс для инициализации вышеуказанных данных. Хотя в будущем он будет вызываться каждой подпрограммой, на самом деле он выполняется только один раз за каждый сеанс:
Sub InitializeFID()
Если Не IsObject(Session("FIDList")) Тогда
Set Session("FIDList")=Server.CreateObject("Scripting.Dictionary")
Сеанс("FID")=0
Конец, если
End Sub
(2) Генерация уникального идентификатора формы
Следующая функция GenerateFID() используется для генерации уникального идентификатора формы. Эта функция сначала увеличивает значение FID на 1, а затем возвращает его:
Функция GenerateFID()
ИнициализироватьFID
Сеанс("FID") = Сеанс("FID") + 1
GenerateFID = Сеанс("FID")
Конечная функция
(3) Зарегистрируйте отправленную форму.
Когда форма будет успешно отправлена, зарегистрируйте ее уникальный идентификатор в объекте Dictionary:
Sub RegisterFID().
Тусклый стрFID
ИнициализироватьFID
стрFID = Запрос("FID")
Session("FIDlist").Добавить strFID, сейчас()
End Sub
(4) Проверьте, отправляется ли форма повторно.
Перед формальной обработкой формы, отправленной пользователем, следует проверить, зарегистрирован ли ее FID в объекте «Словарь». Для завершения этой работы используется следующая функция CheckFID(). Если она была зарегистрирована, она возвращает FALSE, в противном случае — TRUE:
Функция CheckFID().
Тусклый стрFID
ИнициализироватьFID
стрFID = Запрос("FID")
CheckFID = not Session("FIDlist").Exists(strFID)
Конечная функция
2. Как использовать
Существует два места, где используется вышеуказанная функция, а именно: при создании формы и при обработке результатов. Предположим, что указанные выше четыре подпрограммы помещены во включенный файл Forms.inc. Следующий код определяет, следует ли генерировать форму или обрабатывать результаты формы на основе значения FID. Описываемый процесс обработки подходит для большинства приложений ASP:
< %Option Explicit%>
< !--#include file="forms.inc"-->
<HTML>
<ГОЛОВА>
<TITLE>Тест подачи формы</TITLE>
</ГОЛОВКА
<ТЕЛО>
<%
Если Запрос("FID") = "" Тогда
Генерироватьформу
Еще
ПроцессФорма
Конец, если
%>
</ТЕЛО>
< /HTML>
GenerateForm отвечает за создание формы, которая должна содержать скрытый FID, например:
< %
Подгенерироватьформу()
%>
< form action="< %=Request.ServerVariables("PATH_INFO")%>" метод=GET>
< тип ввода=скрытое имя=значение FID="< %=GenerateFID()%>">
<тип ввода=текстовое имя="param1" значение="">
<тип ввода=отправить значение="ОК">
</форма>
<%
Конец субтитра
%>
ProcessForm отвечает за обработку содержимого, отправленного через форму, но перед обработкой необходимо вызвать CheckFID(), чтобы проверить, была ли отправлена текущая форма. Код выглядит следующим образом:
< %>.
Форма ПодПроцесса()
Если CheckFID() Тогда
Response.Write "То, что вы ввели" и Request.QueryString("param1")
РегистрацияFID
Еще
Response.Write «Эту форму можно отправить только один раз!»
Конец, если
Конец субтитра
%>
3. Ограничения и меры по улучшению
Выше мы представили метод, позволяющий ограничить отправку одной и той же формы несколько раз в течение текущего сеанса. В практических приложениях могут потребоваться улучшения во многих аспектах, например:
⑴ Проверьте законность данных, введенных пользователем, перед регистрацией идентификатора формы, чтобы, если данные незаконны, пользователь мог нажать «Назад». Кнопка, чтобы вернуться и снова отправить ту же форму после исправления.
⑵ Это ограничение на отправку формы действительно только на время текущего сеанса. Если это ограничение необходимо для охвата нескольких сеансов, для сохранения соответствующих данных будут использоваться файлы cookie или база данных.