Se você quiser evitar envios duplos, você deve armazenar o estado de "é enviado" versus "não foi enviado". Você tem várias opções de onde manter essas informações.
- Banco de dados - Adicione um campo oculto com um valor gerado automaticamente que seja único (você pode gerar uma string aleatória curta e anexar a hora atual). Esse valor também pode ser usado para identificar a conversa -- se você precisar de uma conversa na Web com estado. Adicione esse valor ao banco de dados e torne-o exclusivo. Desvantagens:armazenamento redundante no banco de dados, desempenho reduzido na inserção de comentários, necessidade de gerar uma string única.
- Sessão - Adicione o mesmo campo oculto com um valor gerado em uma matéria semelhante. Quando o usuário enviar o formulário, salve o valor na sessão, se ainda não estiver lá. Se for, é uma submissão dupla. Desvantagens:você ainda precisa gerar o token exclusivo.
- Navegador - (1) Adicione algum javascript para desabilitar o botão de envio assim que for clicado. (2) ter um campo oculto que começa com o valor 0 e é alterado para 1 quando o usuário clica no botão enviar. Se o usuário clicar no botão novamente, você verifica se o valor é 1 e aborta se for. Vantagens:sem string única. Desvantagens:requer que o javascript esteja habilitado; você pode exigir a string de qualquer maneira para implementar conversas na Web com estado.