1 javascript, establezca una variable y solo permita el envío una vez.
<script language="javascript">
var checkSubmitFlg = false;
función checkSubmit() {
if (checkSubmitFlg == true) {
return false
}
checkSubmitFlg = true
}
document.ondblclick
= function docondblclick() {
window.event .returnValue = false
}
document.onclick
=
función doconclick() {
if (checkSubmitFlg) {
window.event.returnValue = false
;
<html:form action="myAction.do" método="post" onsubmit="return checkSubmit();">
2 Aún usando javascript, configure el botón de envío o la imagen para desactivar
<html:form action="myAction.do" método ="post"
onsubmit="getElById('submitInput').disabled = true; return true;">
<html:image styleId="submitInput" src="images/ok_b.gif" border="0" />
< / html:form>
3 Utilice el mecanismo de token de sincronización de struts
para resolver el problema de envíos repetidos en aplicaciones web. Struts también proporciona una implementación de referencia.
Principio básico:
antes de procesar una solicitud entrante, el servidor comparará el valor del token contenido en la solicitud con el valor del token guardado en la sesión del usuario actual para ver si hay una coincidencia. Después de procesar la solicitud y antes de enviar la respuesta al cliente, se generará un nuevo token. Además de pasarse al cliente, este token también reemplazará el token anterior guardado en la sesión del usuario. De esta manera, si el usuario regresa a la página de envío anterior y envía nuevamente, el token pasado por el cliente será inconsistente con el token en el lado del servidor, lo que evitará efectivamente envíos repetidos.
if (isTokenValid(request, true)) {
// su código aquí
return mapeo.findForward("success");
}
else {
saveToken
(request);
return mapeo.findForward("submitagain");
El ID y la hora actual del sistema se utilizan para generar un token único (para cada sesión). Para una implementación específica, consulte el método generateToken() en la clase TokenProcessor.
1. //Verifique el token de control de transacciones. <html:form> generará automáticamente un token representativo de entrada implícito basado en el identificador en la sesión para evitar el envío doble.
2. En la acción:
//<input type="hidden" nombre="org.apache.struts.taglib.html.TOKEN"
// valor="6aa35341f25184fd996c4c918255c3ae">
if (!isTokenValid(request))
errores.add(ActionErrors.GLOBAL_ERROR,
new ActionError("error.transaction.token") ) ;
resetToken(solicitud); //Eliminar el token en la sesión
3. La acción tiene un método para generar token
protegido GeneraToken(solicitud HttpServletRequest) {
HttpSession session = request.getSession();
try {
byte id[] = session .getId ().getBytes();
byte ahora[] =
new Long(System.currentTimeMillis()).toString().getBytes();
MessageDigest
md =MessageDigest.getInstance
("MD5");
.update(ahora);
return (toHex(
md.digest()));
} catch (IllegalStateException e) {
return (nulo
} catch (NoSuchAlgorithmException e) {
return (null)
;