Pergunta

Eu estou trabalhando em uma aplicação web (J2EE) e eu gostaria de saber as opções que estão disponíveis para lidar com um duplo cargo a partir do navegador.

As soluções que eu tenho visto e usado no passado são todos do lado do cliente:

  • Desativar o botão enviar, assim que o usuário clica-lo.
  • Siga um padrão POST-Redirect-GET para evitar POSTs quando o usuário clica no botão de volta.
  • Manipular o evento onSubmit do formulário e acompanhar o status de envio com JavaScript.

Eu preferiria para implementar uma solução do lado do servidor, se possível. Há algum melhor se aproxima do que os que eu mencionei acima, ou são soluções do lado do cliente melhor?

Foi útil?

Solução

É difícil implementar uma solução à prova de idiotas (como eles estão melhorando sempre os idiotas). Não importa o que você faz, o lado do cliente pode ser manipulado ou executar incorretamente.

A sua solução tem que ser do lado do servidor para ser confiável e seguro. Dito isso, uma abordagem é revisar o estado do sistema pedido e cheque / banco de dados ou registros para determinar se ele já foi processado. Idealmente, o processo no lado do servidor deve ser idempotent se possível , e ele terá de proteger contra submete dupe se ele não pode ser.

Outras dicas

Você poderia fornecer um "bilhete", como parte do formulário, algum número aleatório -. E certifique-se que não se aceitou duas vezes, no lado do servidor

soluções Dois do lado do servidor vêm à mente:

  1. Criar um tempo de uso "tokens" em um campo de formulário oculto. Uma vez que um token é usado, ele é excluído de qualquer banco de dados ou sessão contexto objeto que você está armazenando-o em. Na segunda vez, ele não aceitou.
  2. Informações Cache recebeu, e se uma forma idêntica for recebida dentro de um determinado período de tempo (10 minutos a uma hora? Você decide!) É ignorado.

Implementar um uniqueid para ir com o pedido e registrá-lo junto com a execução. Se o ID já foi registrado, você não fazer o trabalho novamente. Este é um bocado como a solução de reserva - e você deve tentar desativar o botão ou link clientside, assim como você sugeriu-se

nós usamos um momento sensível, um bilhete tempo. É como um ID de sessão da espécie. Mas ele está ligado ao formulário / página.

Você descartar o bilhete quando o usuário envia a página, e você só páginas de processo que vem com um bilhete válido. Você pode, ao mesmo tempo, reforçar a segurança, anexando o bilhete para um usuário, por isso tat se um bilhete vem em que é enviado por um usuário que não seja o usuário que o bilhete foi submetido, você rejeitar o pedido.

Struts tem algo como este construído em se acontecer de você usá-lo.

http: //struts.apache .org / 1.x / apidocs / org / apache / suportes / util / TokenProcessor.html

eu usaria um timestamp e comparar os valores com o código do lado do servidor. Se dois timestamps estão perto o suficiente e têm o mesmo endereço IP, ignore o segundo envio do formulário.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top