Evitar vários submits do mesmo form

Bom dia!

Estou enfrentando um problema com formulários onde o usuário tem o dedo nervoso e clica várias vezes no submit e a função é executada várias vezes.

Estou usando o VRaptor3.5 temos como evitar isso no server side??

A solução mais simples é desabilitar o botão depois de um click na UI. Você pode tentar entender quando o botão deve ser habilitado, depende do caso.

No server side, você pode fazer isso de algumas formas diferentes, como por exemplo serializar o acesso à função (synchronized ou similares no Java EE) em um singleton. Quando a função for executada pela primeira vez, você pode marcar a timestamp em uma variável e verificá-la antes de executar o método de novo, impondo um limite de tempo para a execução do método. Ficou meio confuso, deixa eu tentar explicar em código (pseudo-java):

private long ultimaExecucao = 0;
private long tempoMinimoEntreExecucoesEmMilissegundos = 10000; // 10 segundos 
public synchronized void func() {
    final long millisAtuais = System.currentTimeMillis();
    if (millisAtuais - ultimaExecucao < tempoMinimoEntreExecucoesEmMilissegundos) {
        // faz o que tiver de fazer
        ultimaExecucao = millisAtuais;
    }
}

É só um exemplo do que dá para ser feito. Eu particularmente não concordo com uma abordagem assim, acho que dá pra tratar legal na UI ou na lógica do negócio, com bloqueios e checagens variadas.

1 curtida

Vc tb pode usar o pattern JEE chamado de “Synchronized Token”.
Vc tb pode usar outro pattern HTTP chamado de “Post/Redirect/Get”
Fique a vontade :slight_smile: