web-applications - property - title attribute in html
Resolviendo el problema de la sumisiĆ³n doble (7)
Me gustaría ver cómo los desarrolladores web evitan el problema del envío doble. Así que básicamente mi comprensión del problema es la siguiente:
El envío doble ocurre cuando un usuario impaciente envía un formulario varias veces, lo que causa problemas. Este problema puede solucionarse con JavaScript (específicamente con las secuencias de comandos de jQuery) que deshabilita el botón de envío una vez que se ha enviado el formulario. Una debilidad de esto es que los clientes tienen JavaScript deshabilitado.
También hay métodos de detección del lado del servidor.
Así que mis preguntas son:
¿Cómo las personas superan la doble sumisión? ¿Cuál es un ejemplo real de un problema causado por envíos dobles? ¿Hay marcos de aplicaciones web con herramientas de envío doble integradas?
El marco web2py tiene una protección integrada contra el envío de formularios dobles. Almacena un token de una sola vez en la sesión, así como en un campo oculto en el formulario, y deben coincidir con el envío o se rechazará el envío. Este método también protege contra CSRF (falsificación de solicitud entre sitios).
Si el formulario tiene la intención de proporcionar una interfaz para guardar algunos datos en dbms del servidor, puede usar un campo de revisión especial que es obligatorio para los datos enviados. Una verificación de si la revisión enviada coincide o no con la versión más reciente de los datos en la base de datos (o es la de una nueva pieza de datos que se insertará), puede proporcionarle un buen control de qué hacer si se realizan varios envíos en secuencia.
Si está trabajando con scripts del lado del servidor java y también está utilizando struts 2, debe consultar este enlace que trata sobre el uso de token.
http://www.xinotes.org/notes/note/369/
Se debe generar un token y mantenerlo en sesión para el procesamiento de la página inicial, cuando la solicitud se envía junto con el token por primera vez, en la acción de struts ejecute un subproceso con el nombre de subproceso como el identificador del token y ejecute la lógica independientemente de lo que el cliente tenga solicitado, cuando el cliente vuelva a enviar la misma solicitud, verifique si el subproceso aún se está ejecutando (thread.getcurrentthread (). interrumpido) si aún se está ejecutando, luego envíe un redireccionamiento del cliente 503.
Mire el interceptor ExecuteAndWait de struts 2code, la lógica de este combinado con el token lo ayudará a hacer clic rápido
Situación de la vida real: apostar en un sitio web de apuestas. Los usuarios harían doble clic y obtendrían dos apuestas. ¡No está bien! Los chequeos de Javascript no fueron suficientes para evitar esto.
Solución:
Cree una entrada oculta UUID / GUID en el formulario utilizando el lenguaje de secuencias de comandos del lado del servidor que representa el formulario.
Inmediatamente después de enviar el formulario, agregue esto a una tabla de base de datos llamada
UniqueSubmissions
(por ejemplo). Luego proceder con el procesamiento.Todas las solicitudes posteriores con el mismo UUID / GUID se rechazarán si se encuentran en la tabla
UniqueSubmissions
.
Esto funcionó para nosotros. Espero que ayude a responder su pregunta!
Un ejemplo de la vida real sería esta respuesta publicada dos veces ;-). Si no desea confiar en ningún aspecto del lado del cliente (javascript o incluso cookies), puede calcular un hash MD5 de los datos enviados, posiblemente agregando información como la IP de origen y el navegador utilizado, y rechace las publicaciones. que tienen el mismo hash.
Usando el framework de aplicaciones web de struts podemos manejar este problema de la siguiente manera:
Struts tiene 3 métodos de uso para el token, saveToken(), isTokenValid() and resetToken()
.
saveToken()
: genera la clave del token y la guarda en el atributo de solicitud / sesión.
isTokenValid()
: validar la clave del token enviado contra la tienda 1 en solicitud / sesión.
resetToken()
: restablece la clave del token.
Cómo funciona:
1) Al cargar el formulario, invoca saveToken()
en la clase de acción para crear y almacenar la clave del token. Struts almacenará la clave generada en la solicitud / sesión. Si el token se creó correctamente, cuando vea la fuente en el navegador verá algo similar a lo siguiente, la clave del 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 se envía el formulario, invoca isTokenValid()
en la clase de acción, validará la clave del token enviado (campo oculto) con la clave del token almacenada previamente en la solicitud / sesión. Si coincide, 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);
}
Utilice la redirect-after-post o, a veces, llamada PRG (publicación / redirección / obtención)
En resumen, cuando el usuario publica el formulario, realiza una redirección del lado del cliente (después de consumir los datos de la publicación) a la página de respuesta (éxito).