Encontramos inúmeros formulários na Internet todos os dias e também vemos que a maioria deles não restringe os usuários de enviar o mesmo formulário várias vezes. A falta de tais restrições pode por vezes produzir alguns resultados inesperados, tais como assinaturas repetidas de serviços de e-mail ou votações repetidas. Talvez alguns iniciantes em ASP não saibam como limitar o envio repetido do mesmo formulário em aplicativos ASP, então apresentarei aqui um método simples para evitar que os usuários enviem o mesmo formulário várias vezes durante a sessão atual em aplicativos ASP.
Este trabalho é composto principalmente por quatro sub-rotinas. Em aplicações mais simples, basta colocar esses códigos nos arquivos incluídos para referência direta, para ambientes mais complexos, damos algumas sugestões de melhorias no final do artigo;
1. Processo básico de trabalho
Abaixo discutiremos essas quatro sub-rotinas separadamente.
(1) Inicialização
Aqui precisamos salvar duas variáveis no objeto Session, entre as quais:
⑴ Cada formulário corresponde a um identificador único chamado FID, e um contador é usado para tornar este valor único.
⑵ Sempre que um formulário for enviado com sucesso, seu FID deverá ser armazenado em um objeto Dicionário.
Usamos um processo dedicado para inicializar os dados acima. Embora seja chamado por cada sub-rotina no futuro, na verdade só é executado uma vez durante cada sessão:
Sub InitializeFID()
If Not IsObject(Session("FIDList")) Então
Definir Sessão("FIDList")=Server.CreateObject("Scripting.Dictionary")
Sessão("FID")=0
Terminar se
End Sub
(2) Gere o identificador exclusivo do formulário.
A seguinte função GenerateFID() é usada para gerar o identificador exclusivo do formulário. Esta função primeiro incrementa o valor FID em 1 e depois o retorna:
Função GenerateFID()
InicializarFID
Sessão("FID") = Sessão("FID") + 1
GerarFID = Sessão("FID")
Função End
(3) Registrar o formulário enviado
Quando o formulário for enviado com sucesso, registre seu identificador exclusivo no objeto Dicionário:
Sub RegisterFID().
Diminuir strFID
InicializarFID
strFID = Solicitação("FID")
Sessão("FIDlist").Adicionar strFID, now()
End Sub
(4) Verifique se o formulário foi enviado repetidamente
Antes de processar formalmente o formulário enviado pelo usuário, deve-se verificar se seu FID foi registrado no objeto Dicionário. A seguinte função CheckFID() é usada para completar este trabalho. Se tiver sido registrada, retorna FALSE, caso contrário retorna TRUE:
Função CheckFID().
Diminuir strFID
InicializarFID
strFID = Solicitação("FID")
CheckFID = não Sessão("FIDlist").Exists(strFID)
Função Final
2. Como usar
Existem dois locais onde a função acima é usada, nomeadamente quando o formulário é gerado e quando os resultados são processados. Suponha que as quatro sub-rotinas acima tenham sido colocadas no arquivo Forms.inc incluído. O código a seguir determina se deve gerar um formulário ou processar os resultados do formulário com base no valor FID. O processo de processamento descrito é adequado para a maioria dos aplicativos ASP:
< %Opção Explícita%>
< !--#include file="forms.inc"-->
<HTML>
<CABEÇA>
<TITLE>Teste de envio de formulário</TITLE>
</CABEÇA
<CORPO>
<%
Se Solicitação("FID") = "" Então
Gerar Formulário
Outro
Formulário de Processo
Terminar se
%>
</CORPO>
< /HTML>
GenerateForm é responsável por gerar o formulário, que deverá conter um FID oculto, como:
< %
SubGenerateForm()
%>
< form action="< %=Request.ServerVariables("PATH_INFO")%>" método=GET>
< tipo de entrada=nome oculto=valor FID="< %=GerarFID()%>">
<tipo de entrada=nome do texto="param1" valor="">
<tipo de entrada=enviar valor="OK">
</formulário>
<%
Finalizar sub
%>
ProcessForm é responsável por processar o conteúdo enviado através do formulário, mas antes do processamento, CheckFID() deve ser chamado para verificar se o formulário atual foi enviado. O código é o seguinte:
< %.
SubProcessForm()
Se CheckFID() Então
Response.Write "O que você digitou é" & Request.QueryString("param1")
RegistrarFID
Outro
Response.Write "Este formulário só pode ser enviado uma vez!"
Terminar se
Finalizar sub
%>
3. Limitações e medidas de melhoria
Acima, introduzimos um método para limitar o envio do mesmo formulário várias vezes durante a sessão atual. Em aplicações práticas, pode ser necessário fazer melhorias em vários aspectos, por exemplo:
⑴ Verifique a legalidade dos dados inseridos pelo usuário antes de cadastrar o ID do formulário, para que quando os dados forem ilegais, o usuário possa pressionar o botão "Voltar" botão para retornar e enviar o mesmo formulário novamente após a correção.
⑵ Esta restrição ao envio de formulários é válida apenas durante a sessão atual, no máximo. Se esta restrição for necessária para abranger várias sessões, Cookeis ou um banco de dados serão usados para salvar os dados relevantes.