Nos encontramos con innumerables formularios en Internet todos los días y también vemos que la mayoría de ellos no impiden que los usuarios envíen el mismo formulario varias veces. La falta de tales restricciones a veces puede producir algunos resultados inesperados, como suscripciones repetidas a servicios de correo electrónico o votaciones repetidas. Tal vez algunos principiantes de ASP no sepan cómo limitar el envío repetido del mismo formulario en aplicaciones ASP, por lo que aquí les presentaré un método simple para evitar que los usuarios envíen el mismo formulario varias veces durante la sesión actual en aplicaciones ASP.
Este trabajo se compone principalmente de cuatro subrutinas. En aplicaciones más simples, solo necesita colocar estos códigos en los archivos incluidos como referencia directa. Para entornos más complejos, damos algunas sugerencias de mejora al final del artículo.
1. Proceso de trabajo básico
A continuación analizamos estas cuatro subrutinas por turno.
(1) Inicialización
Aquí necesitamos guardar dos variables en el objeto Sesión, entre las cuales:
⑴ Cada formulario corresponde a un identificador único llamado FID, y se usa un contador para hacer que este valor sea único.
⑵ Siempre que un formulario se envía correctamente, su FID debe almacenarse en un objeto Diccionario.
Utilizamos un proceso dedicado para inicializar los datos anteriores. Aunque cada subrutina la llamará en el futuro, en realidad solo se ejecuta una vez durante cada sesión:
Sub InitializeFID()
Si no es Objeto(Session("FIDList")) Entonces
Establecer sesión("FIDList")=Server.CreateObject("Scripting.Dictionary")
Sesión("FID")=0
Terminar si
End Sub
(2) Generar el identificador único del formulario.
La siguiente función GenerateFID() se utiliza para generar el identificador único del formulario. Esta función primero incrementa el valor FID en 1 y luego lo devuelve:
Función GenerateFID()
InicializarFID
Sesión("FID") = Sesión("FID") + 1
GenerarFID = Sesión ("FID")
Función final
(3) Registre el formulario enviado
Cuando el formulario se envíe correctamente, registre su identificador único en el objeto Diccionario:
Sub RegisterFID().
strFID tenue
InicializarFID
strFID = Solicitud ("FID")
Sesión("FIDlist").Agregar strFID, ahora()
End Sub
(4) Verifique si el formulario se envía repetidamente
Antes de procesar formalmente el formulario enviado por el usuario, debe verificar si su FID se ha registrado en el objeto Diccionario. La siguiente función CheckFID() se utiliza para completar este trabajo. Si ha sido registrada devuelve FALSO, en caso contrario devuelve VERDADERO:
Función CheckFID().
strFID tenue
InicializarFID
strFID = Solicitud ("FID")
CheckFID = no sesión ("FIDlist"). Existe (strFID)
Función final
2. Cómo usar
Hay dos lugares donde se usa la función anterior, a saber, cuando se genera el formulario y cuando se procesan los resultados. Supongamos que las cuatro subrutinas anteriores se han colocado en el archivo incluido Forms.inc. El siguiente código determina si se genera un formulario o se procesan los resultados del formulario en función del valor FID. El proceso de procesamiento que describe es adecuado para la mayoría de las aplicaciones ASP:
< %Opción explícita%>
<!--#include file="forms.inc"-->
<HTML>
<CABEZA>
<TÍTULO>Prueba de envío de formulario</TÍTULO>
</CABEZA
<CUERPO>
< %
Si Solicitud("FID") = "" Entonces
Generar formulario
Demás
Formulario de proceso
Terminar si
%>
</CUERPO>
< /HTML>
GenerateForm es responsable de generar el formulario, que debe contener un FID oculto, como por ejemplo:
< %
SubGenerarForm()
%>
< formulario acción="< %=Request.ServerVariables("PATH_INFO")%>" método=GET>
< tipo de entrada=nombre oculto=valor FID="< %=GenerarFID()%>">
<tipo de entrada=nombre de texto="param1" valor="">
<tipo de entrada=valor de envío="OK">
</formulario>
< %
Subtítulo final
%>
ProcessForm es responsable de procesar el contenido enviado a través del formulario, pero antes de procesarlo, se debe llamar a CheckFID () para verificar si se ha enviado el formulario actual. El código es el siguiente:
<%.
Formulario de subproceso()
Si CheckFID() Entonces
Response.Write "Lo que ingresó es" & Request.QueryString("param1")
RegistrarseFID
Demás
Response.Write "¡Este formulario solo se puede enviar una vez!"
Terminar si
Subtítulo final
%>
3. Limitaciones y medidas de mejora
Anteriormente introdujimos un método para limitar el envío del mismo formulario varias veces durante la sesión actual. En aplicaciones prácticas, es posible que sea necesario realizar mejoras en muchos aspectos, por ejemplo:
⑴ Verifique la legalidad de los datos ingresados por el usuario antes de registrar el ID del formulario, de modo que cuando los datos sean ilegales, el usuario pueda presionar "Atrás" para regresar y enviar el mismo formulario nuevamente después de la corrección.
⑵ Esta restricción en el envío de formularios es válida solo durante la sesión actual como máximo. Si se requiere que esta restricción abarque varias sesiones, se utilizará Cookeis o una base de datos para guardar los datos relevantes.