Domanda

Mi piacerebbe vedere come gli sviluppatori web evitare il doppio problema di presentazione. Quindi, in pratica la mia comprensione del problema è il seguente:

Doppia presentazione si verifica quando un utente impaziente invia un modulo più volte, causando problemi. Questo problema può essere risolto da JavaScript (in particolare gli script jQuery) che disabilita il pulsante di invio una volta che il messaggio è stato inviato - una debolezza di questo è se i clienti hanno disabilitato JavaScript.

Ci sono anche metodi lato server di rilevamento.

Quindi le mie domande sono le seguenti:

Come fanno le persone a superare doppia presentazione? Che è un esempio di vita reale di un problema causato da doppie sottomette? Fare qualsiasi web application framework sono strumenti doppie presentazione costruito nel?

È stato utile?

Soluzione

Se si sta lavorando con il lato scripting server Java e anche utilizzando montanti 2 allora si riferiscono questo link che parla sull'utilizzo di token.

http://www.xinotes.org/notes/note/369/

Un token dovrebbe essere generato e tenuto in sessione per la pagina iniziale di rendering, quando la richiesta è presentata insieme con il token per la prima volta, in azione puntoni eseguire un thread con il nome filo come l'id di token ed eseguire la logica di qualunque il cliente ha richiesto per, quando il client invia nuovamente la stessa richiesta, verificare se il thread è ancora in esecuzione (thread.getcurrentthread (). interrotto) se ancora in esecuzione quindi inviare un reindirizzamento client 503.

Si prega di guardare l'ExecuteAndWaitInterceptor di montanti 2Codice, la logica di questo combinato con token dare una mano veloce clic

Altri suggerimenti

situazione reale: scommettere su un sito web di scommesse. Gli utenti sarebbero doppio click e ottenere due scommesse piazzate. Non bene! controlli JavaScript non sono stati sufficienti per evitare questo.

Soluzione:

  1. UUID / GUID ingresso nascosto in forma utilizzando un linguaggio di scripting lato server che rende il modulo.

  2. Il modulo di presentazione aggiungere immediatamente questo per una tabella di database chiamato UniqueSubmissions (per esempio). Quindi procedere con il trattamento.

  3. Ogni successiva richiesta con lo stesso UUID / GUID sarà respinta se trovato nella tabella UniqueSubmissions.

Questo ha funzionato per noi. La speranza che aiuta a rispondere alla tua domanda!

Utilizza la reindirizzamento-dopo-post o talvolta chiamato PRG (posta / reindirizzamento / get)

In breve, quando i posti di utente del modulo, si esegue un redirect lato client (dopo aver consumato i dati post) alla pagina di risposta (successo).

Un vero esempio di vita sarebbe stata questa risposta ha postato due volte ;-). Se non si vuole fare affidamento su qualsiasi aspetto del lato client (JavaScript, o biscotti pari), è possibile calcolare un hash MD5 dei dati presentati, eventualmente con l'aggiunta di informazioni come IP sorgente e il browser utilizzato, e rifiutare i messaggi che hanno lo stesso hash.

Il web2py quadro ha una protezione integrata contro le doppie invio del modulo. Memorizza una sola volta gettone nella sessione, così come in un campo nascosto nella forma, e si deve corrispondere al momento della presentazione o la presentazione viene rifiutato. Questo metodo anche protegge contro CSRF (cross-site request forgery).

Se il modulo ha un intento di fornire un'interfaccia per il salvataggio di alcuni dati in DBMS Server, è possibile utilizzare speciale campo di revisione che è obbligatorio per i dati presentati. Un controllo se le partite di revisione presentate quello della versione più recente dei dati nel database o no (o è quella di un nuovo pezzo di dati da inserire), potrebbe fornire con un buon controllo di cosa fare se diverse sottomette sono fatti in sequenza.

Utilizzando montanti framework web-applicazione che può gestire questo problema nel seguente modo:

Struts ha 3 metodi utilizzano per la token, saveToken(), isTokenValid() and resetToken().

saveToken() - generare la chiave di token e salvare all'attributo richiesta / sessione
. isTokenValid() - validate presentato chiave Token contro l'1 negozio di richiesta / sessione di
. resetToken() - reimpostare la chiave di token.

Come funziona:
1) Dopo il caricamento del modulo, invoca saveToken() sulla classe azione per creare e memorizzare la chiave token. Struts memorizzerà la chiave generata in richiesta / sessione. Se il token creato con successo, quando la sorgente vista sul browser si vedrà qualcosa di simile a quanto segue, la chiave token viene memorizzato come un campo nascosto:

<form action="myaction.do" method="post"> 
 <input type="hidden" 
 name="<%= Constants.TOKEN_KEY %>" 
 value="<%= session.getAttribute(Action.TRANSACTION_TOKEN_KEY) %>" > 

2) Una volta che il modulo presentato, invoca isTokenValid() sulla classe azione, convaliderà la chiave di token presentata (campo nascosto) con la chiave di token precedentemente memorizzato su richiesta / sessione. Se corrispondenza, restituirà true.

public final ActionForward perform(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
    saveToken(request);
    if (!tokenIsValid(request)) {
        //forward to error page saying "your transaction is already being processed" 
    } else {
        //process action 
        //forward to jsp 
    }
    // Reset token after transaction success. 
    resetToken(request);
}

riferimento

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top