A página um contém um formulário HTML. Página dois - o código que lida com os dados enviados.
O formulário na página um é enviado. O navegador é redirecionado para a página dois. A página dois trata dos dados enviados.
Nesse ponto, se a página dois for atualizada, um alerta "Confirmar reenvio de formulário" aparecerá.
Isso pode ser evitado?
Respostas:
Existem 2 abordagens que as pessoas costumam adotar aqui:
Método 1: Use AJAX + Redirect
Desta forma, você publica seu formulário em segundo plano usando JQuery ou algo semelhante a Page2, enquanto o usuário ainda vê a page1 exibida. Após a postagem bem-sucedida, você redireciona o navegador para a Página2.
Método 2: Post + Redirecionar para si mesmo
Esta é uma técnica comum em fóruns. O formulário na Página1 envia os dados para a Página2, a Página2 processa os dados e faz o que precisa ser feito e, em seguida, faz um redirecionamento HTTP para si mesma. Desta forma, a última "ação" que o navegador lembra é um simples GET na página 2, de modo que o formulário não está sendo reenviado em F5.
fonte
Você precisa usar o padrão PRG - Post / Redirect / Get e acabou de implementar o P do PRG. Você precisa redirecionar .(Agora dias você não precisa de redirecionamento. Veja isto )PRG é um padrão de design de desenvolvimento da web que evita alguns envios de formulários duplicados, o que significa: Enviar formulário (Pós-solicitação 1) -> Redirecionar -> Obter (Solicitação 2)
Código de status de redirecionamento - HTTP 1.0 com HTTP 302 ou HTTP 1.1 com HTTP 303
Uma resposta HTTP com código de status de redirecionamento fornecerá adicionalmente um URL no campo do cabeçalho do local. O agente do usuário (por exemplo, um navegador da web) é convidado por uma resposta com este código a fazer uma segunda solicitação, de outra forma idêntica, para o novo URL especificado no campo de localização.
O código de status de redirecionamento é para garantir que, nessa situação, o navegador do usuário da web possa atualizar com segurança a resposta do servidor sem fazer com que a solicitação HTTP POST inicial seja reenviada.
Fonte
fonte
Diretamente, você não pode, e isso é uma coisa boa. O alerta do navegador existe por um motivo. Este tópico deve responder à sua pergunta:
Impedir que o botão Voltar exiba um alerta de confirmação do POST
Duas soluções alternativas principais sugeridas foram o padrão PRG e um envio AJAX seguido por uma realocação de script.
Observe que, se o seu método permitir um método de envio GET e não POST, isso resolveria o problema e se ajustaria melhor à convenção. Essas soluções são fornecidas no pressuposto de que você deseja / precisa POSTAR os dados.
fonte
A única maneira de ter 100% de certeza de que o mesmo formulário nunca será enviado duas vezes é incorporar um identificador exclusivo em cada um deles e rastrear quais foram enviados ao servidor. A armadilha é que, se o usuário voltar para a página onde estava o formulário e inserir novos dados, o mesmo formulário não funcionará.
fonte
A resposta tem duas partes:
Certifique-se de que as postagens duplicadas não mexam com seus dados no servidor. Para fazer isso, incorpore um identificador exclusivo na postagem para que você possa rejeitar solicitações subsequentes do lado do servidor. Este padrão é chamado de Receptor Idempotente em termos de mensagens.
Certifique-se de que o usuário não se incomode com a possibilidade de envios duplicados por ambos
Nada que você faça abaixo de 2. impedirá totalmente envios duplicados. As pessoas podem clicar muito rápido e os hackers podem postar de qualquer maneira. Você sempre precisa de 1. se quiser ter certeza absoluta de que não há duplicatas.
fonte
Se você atualizar uma página com dados POST, o navegador confirmará seu reenvio. Se você usar dados GET, a mensagem não será exibida. Você também pode fazer com que a segunda página, depois de salvar o envio, redirecione para uma terceira página sem dados.
fonte
Bem, eu descobri que ninguém mencionou esse truque.
Sem o redirecionamento, você ainda pode impedir a confirmação do formulário ao atualizar.
Por padrão, o código do formulário é assim:
<form method="post" action="test.php">
agora, mude para
<form method="post" action="test.php?nonsense=1">
Você verá a magia.
Eu acho que é porque os navegadores não irão acionar o pop-up de alerta de confirmação se ele obtiver um método GET (string de consulta) na url.
fonte
Você pode fazer isso usando jquery
Esta é a maneira mais elegante de evitar dados novamente após o envio devido à postagem de volta.
Espero que isto ajude.
fonte
O padrão PRG só pode impedir o reenvio causado pela atualização da página. Esta não é uma medida 100% segura.
Normalmente, realizarei as ações abaixo para evitar o reenvio:
Cliente - Use javascript para evitar cliques duplicados em um botão que irá acionar o envio do formulário. Você pode simplesmente desativar o botão após o primeiro clique.
Lado do servidor - Vou calcular um hash nos parâmetros enviados e salvá-lo na sessão ou banco de dados, para que quando o envio duplicado for recebido, possamos detectar a duplicação e, em seguida, responder corretamente ao cliente. No entanto, você pode conseguir gerar um hash no lado do cliente.
Na maioria das vezes, essas medidas podem ajudar a prevenir a reapresentação.
fonte
Eu realmente gosto da resposta de @Angelin. Mas se você estiver lidando com algum código legado em que isso não seja prático, essa técnica pode funcionar para você.
No topo do arquivo
Então, no final do formulário, insira da
last_pos_sub
seguinte maneira:fonte
Experimente tris:
Como usar / exemplo:
Fonte: https://www.tutdepot.com/prevent-multiple-form-submission/
fonte
use js para evitar adicionar dados:
fonte