Éviter la soumission multiple d'un formulaire web lors d'un rafraîchissement
Quand un utilisateur soumet un formulaire web (exemples : une commande, une souscription, une nouvelle version de page wiki) dont l'envoi est de type POST, le navigateur l'envoie avec la méthode POST, et reçoit une confirmation du serveur après traitement de la requête et du formulaire.
Ce problème est résolu côté serveur en répondant par une redirection :
L'utilisateur envoi le formulaire (bouton Submit, OK, ...)
Client -> Serveur : envoi du formulaire
POST ...
Le serveur traite le formulaire
Serveur -> Client : redirection vers la page de confirmation
HTTP/1.0 303 See Other
Client -> Serveur : demande avec la nouvelle URL de la page de confirmation en utilisant la méthode GET conformément à la spécification du protocole HTTP quand le client reçoit le code de réponse 303.
GET ...
Serveur -> Client : envoi de la page de confirmation
HTTP/1.0 200 OK
Le client affiche la page qu'il vient de recevoir, et l'utilisateur décide de rafraîchir la page
Donc le navigateur répète la même requête GET.
Client -> Serveur : rafraîchir sans ré-envoi du formulaire
GET ...
Diagramme de la résolution du problème avec le patron PRG.
Le client reçoit une redirection au lieu de la page directement en réponse de l'envoi du formulaire.
Le protocole HTTP spécifie que la redirection de code 303 doit être faite avec la méthode GET, ce que fait le client aussitôt pour recevoir la page de confirmation.
Si l'utilisateur rafraîchit la page, le formulaire n'est plus renvoyé car la redirection a forcé le changement de méthode à GET.
Le nom du patron de conception donne donc un résumé des premiers échanges effectués (requête POST, réponse REDIRECT, requête GET).