Pregunta

Me gustaría ver cómo los desarrolladores web a evitar el problema de la doble presentación. Así que básicamente mi comprensión del problema es el siguiente:

Doble presentación se produce cuando un usuario impaciente somete una forma varias veces, causando problemas. Este problema se puede solucionar mediante JavaScript (específicamente las secuencias de comandos de jQuery) que desactiva el botón de enviar una vez que el formulario ha sido enviado - una debilidad de esto es si los clientes tienen JavaScript desactivado.

También hay métodos lado del servidor de la detección.

Así que mis preguntas son:

¿Cómo la gente a superar el doble presentación? ¿Qué es un ejemplo real de un problema causado por somete dobles? Hacer cualquier aplicación de marcos de red tienen herramientas de presentación dobles construidas en?

¿Fue útil?

Solución

Si trabaja con secuencias de comandos del lado del servidor Java y también utilizando puntales 2 a continuación, se refieren este enlace que habla sobre el uso de token.

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

Una ficha debe ser generado y guardado en la sesión de la página inicial render, cuando la solicitud se presenta junto con el token, por primera vez, en la acción puntales ejecutar un hilo con el nombre de hilo como el ID de símbolo y ejecutar la lógica de lo el cliente ha solicitado para, cuando el cliente presente una vez más la misma petición, comprobar si el hilo sigue corriendo (thread.getcurrentthread (). interrumpe) si aún en marcha a continuación, enviar una redirección 503 cliente.

Por favor, mira el ExecuteAndWaitInterceptor de puntales 2code, la lógica de esta combinado con fichas le ayudará a cabo clic rápido

Otros consejos

situación de la vida real: la colocación de apuestas en un sitio web de apuestas. Los usuarios se duplicarían clic y obtener dos apuestas realizadas. ¡No está bien! cheques JavaScript no fueron suficientes para evitar esto.

Solución:

  1. UUID / GUID entrada oculta en forma usando lenguaje de script del lado del servidor que hace que el formulario.

  2. El formulario de presentación de añadir de inmediato a un cuadro base de datos llamada UniqueSubmissions (por ejemplo). A continuación, proceder con el procesamiento.

  3. Cada solicitud posterior con el mismo UUID / GUID será rechazada si se encuentran en la tabla UniqueSubmissions.

Esto funcionó para nosotros. Esperanza de que ayuda a responder a su pregunta!

Utilice el redirección después del post o, a veces llamado PRG (post / redireccionamiento / get)

En resumen, cuando los mensajes de los usuarios la forma, se realiza una redirección del lado del cliente (después de consumir los datos de correos) a la página de respuesta (éxito).

Un ejemplo de la vida real sería esta respuesta ha escrito dos veces ;-). Si no quiere depender de cualquier aspecto del lado del cliente (Javascript, o incluso galletas), se puede calcular un hash MD5 de los datos presentados, posiblemente añadiendo información, como fuente de IP y el navegador utilizado, y rechazar los mensajes que tienen el mismo hash.

El web2py marco tiene una función de protección contra presentación forma doble. Se almacena una sola vez de ficha en la sesión, así como en un campo oculto en el formulario, y que debe coincidir con previa presentación o se rechaza la sumisión. Este método también protege contra CSRF (falsificación de petición cross-site).

Si el formulario tiene la intención de proporcionar una interfaz para salvar algunos datos en DBMS Server, puede utilizar el campo de revisión especial que es obligatorio para los datos presentados. Una comprobación de si los partidos de revisión presentadas el de la versión más reciente de los datos en la base de datos o no (o es la de una nueva pieza de datos que se inserta), podría proporcionar un buen control de qué hacer si se hacen varias somete en secuencia.

El uso de puntales marco de aplicación web que puede manejar este problema de la siguiente manera:

Struts tiene 3 métodos utilizan para la token, saveToken(), isTokenValid() and resetToken().

saveToken() - generar la clave token y salvar al atributo de la petición / sesión
. isTokenValid() - Validar presentó clave señal a la 1 tienda en la solicitud / sesión
. resetToken() - restablecer la clave de token.

¿Cómo funciona?:
1) Al cargar el formulario, invoca saveToken() en la clase de la acción para crear y almacenar la clave token. Puntales almacenará la clave generada en la solicitud / sesión. Si el token creado con éxito, cuando se vista de origen en el navegador verá algo similar a lo siguiente, la clave token se almacena como un campo oculto:

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

2) Una vez que el formulario presentado, invoca isTokenValid() de la clase de acción, se validará la tecla testigo suministrado (campo oculto) con la llave ficha previamente almacenada a petición / sesión. Si partido, devolverá verdadero.

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);
}

referencia

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top