Este artigo apresenta um método simples em aplicativos ASP para impedir que os usuários enviem o mesmo formulário diversas vezes durante a sessão atual. É composto principalmente por quatro sub-rotinas. Em aplicações mais simples, basta colocar esses códigos nos arquivos incluídos e referenciá-los diretamente para ambientes mais complexos, damos algumas sugestões de melhorias no final do artigo;
1. Processo básico de trabalho
Abaixo discutimos 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 exclusivo chamado FID, e um contador é usado para tornar o valor único.
⑵ Sempre que um formulário for enviado com sucesso, seu FID deve 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 por sessão:
SubInitializeFID()
Se não for IsObject(Session(FIDList)) então
Definir Sessão(FIDList)=Server.CreateObject(Scripting.Dictionary)
Sessão(FID)=0
Terminar se
Finalizar sub
(2) Gere um identificador exclusivo para o formulário
A seguinte função GenerateFID() é usada para gerar um identificador exclusivo para o formulário. A função primeiro incrementa o valor do FID em 1 e depois o retorna:
FunçãoGerarFID()
InicializarFID
Sessão (FID) = Sessão (FID) + 1
GerarFID = Sessão (FID)
Função final
(3) Formulário de inscrição enviado
Quando o formulário é enviado com sucesso, seu identificador único é registrado no objeto Dicionário:
SubRegistroFID()
Diminuir strFID
InicializarFID
strFID = Solicitação (FID)
Sessão (lista FID). Adicionar strFID, agora ()
Finalizar sub
(4) Verifique se o formulário é enviado repetidamente
Antes de processar formalmente o formulário enviado pelo usuário, deve-se verificar se o seu FID foi cadastrado 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 VerificaçãoFID()
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 é utilizada, 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 que ele descreve é adequado para a maioria dos aplicativos ASP:
<%Opção Explícita%>
< !--#include arquivo=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()
%>
< ação do formulário=< %=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=valor de envio=OK>
</formulário>
<%
Finalizar sub
%>
ProcessForm é responsável por processar o conteúdo enviado através do formulário, mas antes de processar, você deve chamar CheckFID() 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. Restrições e medidas de melhoria
Acima, introduzimos uma maneira de impedir que o mesmo formulário seja enviado várias vezes durante a sessão atual. Em aplicações práticas, pode ser necessário fazer melhorias em muitos aspectos, tais como:
⑴ 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 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.
⑶ Este método não é seguro. Ele é usado apenas para evitar o uso indevido e não impede que usuários qualificados enviem intencionalmente o mesmo formulário várias vezes.