1 javascript, définissez une variable et n'autorisez la soumission qu'une seule fois.
<script langage="javascript">
var checkSubmitFlg = false;
function checkSubmit() {
if (checkSubmitFlg == true) {
return false
}
checkSubmitFlg = true
}
document.ondblclick
= function docondblclick() {
window.event .returnValue = false;
}
document.onclick = function doconclick() {
if (checkSubmitFlg) {
window.event.returnValue = false
}
}
</script>
<html:form action="myAction.do" method="post" onsubmit="return checkSubmit();">
2 Toujours en utilisant javascript, définissez le bouton ou l'image de soumission pour désactiver
<html:form action="myAction.do" method ="post"
onsubmit="getElById('submitInput').disabled = true; return true;">
<html:image styleId="submitInput" src="images/ok_b.gif" border="0" />
< / html:form>
3 Utilisez le mécanisme de jeton de synchronisation de struts
pour résoudre le problème des soumissions répétées dans les applications Web. Struts fournit également une implémentation de référence.
Principe de base :
Avant de traiter une requête entrante, le serveur comparera la valeur du token contenue dans la requête avec la valeur du token enregistrée dans la session utilisateur en cours pour voir s'il y a une correspondance. Une fois la demande traitée et avant l'envoi de la réponse au client, un nouveau token sera généré. En plus d'être transmis au client, ce token remplacera également l'ancien token enregistré dans la session utilisateur. De cette façon, si l'utilisateur revient à la page de soumission précédente et soumet à nouveau, le jeton transmis par le client sera incohérent avec le jeton côté serveur, empêchant ainsi efficacement les soumissions répétées.
if (isTokenValid(request, true)) {
// votre code ici
return mapping.findForward("success");
}
else {
saveToken(request);
returnmapping.findForward
("submitagain");
ID et L'heure système actuelle est utilisée pour générer un jeton unique (pour chaque session). Pour une implémentation spécifique, veuillez vous référer à la méthode generateToken() dans la classe TokenProcessor.
1. //Vérifiez le jeton de contrôle de transaction. <html:form> générera automatiquement un jeton représentatif d'entrée implicite basé sur l'identifiant dans la session pour éviter la double soumission.
2. Dans l'action :
//<input type="hidden" name ="org.apache.struts.taglib.html.TOKEN"
// value="6aa35341f25184fd996c4c918255c3ae">
if (!isTokenValid(request))
error.add(ActionErrors.GLOBAL_ERROR,
new ActionError("error.transaction.token") ) ;
resetToken(request); //Supprimer le jeton dans la session
3. L'action a une méthode pour générer un jeton
protégé
String generateToken(HttpServletRequest request) {
HttpSession session = request.getSession()
; ().getBytes();
octet maintenant[] =
new Long(System.currentTimeMillis(
)).toString().getBytes();
MessageDigest.getInstance
("MD5")
;.update(maintenant);
return (toHex(
md.digest()));
} catch (IllegalStateException e) {
return (null }
catch (NoSuchAlgorithmException e) {
return (null)
;