web-dev-qa-db-fra.com

Empêcher le bouton Précédent de s'afficher POST alerte de confirmation

J'ai une application qui fournit une longue liste de paramètres à une page Web. Je dois donc utiliser POST au lieu de GET. Le problème est que lorsque la page est affichée et que l'utilisateur clique sur le bouton Précédent, Firefox affiche un avertissement: 

Pour afficher cette page, Firefox doit envoyer des informations qui répètent toute action (telle qu'une recherche ou une confirmation de commande) effectuée précédemment.

Etant donné que l’application est construite de telle sorte que revenir en arrière est une opération assez courante, c’est vraiment gênant pour les utilisateurs finaux.

En gros, je voudrais le faire comme cette page:

 http://www.pikanya.net/testcache/

Entrez quelque chose, envoyez et cliquez sur le bouton Précédent. Pas d'avertissement, ça revient juste.

J'ai trouvé sur Google que cela pourrait être un bogue dans Firefox 3, mais j'aimerais bien avoir ce comportement même après qu'ils l'aient "corrigé". 

Je suppose que cela pourrait être faisable avec certains en-têtes HTTP, mais lequel exactement?

39
Milan Babuškov

Une solution consiste à rediriger le POST vers une page qui redirige vers un service GET - voir Post/Redirect/Get sur wikipedia .

Supposons que votre POST représente 4K de données de formulaire. Vraisemblablement, votre serveur utilise ces données plutôt que de les afficher une seule fois et de les jeter, par exemple en les enregistrant dans une base de données. Continuez comme cela, ou s'il s'agit d'un énorme formulaire de recherche, créez-en une copie temporaire dans une base de données qui sera purgée après quelques jours ou sur une base LRU lorsqu'une limite d'espace est utilisée. Créez maintenant une représentation des données accessibles via GET. Si c'est temporaire, générez un identifiant et utilisez-le comme URL; s'il s'agit d'un ensemble permanent de données, il possède probablement un identifiant ou un élément pouvant être utilisé pour l'URL. Dans le pire des cas, un algorithme tel que celui des très petites URL peut réduire une grande URL en une beaucoup plus petite. Redirige le POST pour obtenir la représentation des données.


Comme note historique, cette technique était pratique établie en 1995 .

27
Pete Kirkham

Voir ma règle d'or de la programmation Web ici:

Arrêtez l'insertion de données deux fois dans une base de données

Il dit: «Ne répondez jamais avec un corps à une demande POST. Faites toujours le travail, puis répondez avec un en-tête Location: à rediriger vers la page mise à jour afin que le navigateur le demande avec GET ”

Si le navigateur demande toujours à l'utilisateur de re-POST, votre application Web est en panne. L'utilisateur ne devrait jamais voir cette question.

37
Ilya Birman

Une façon d'éviter cet avertissement/comportement consiste à effectuer le POST via AJAX, puis à envoyer l'utilisateur à une autre page (ou non) séparément.

3
Sparr

J'ai utilisé la variable Session pour aider dans cette situation. Voici la méthode que j'utilise et qui fonctionne très bien pour moi depuis des années:

//If there's something in the POST, move it to the session and then redirect right back to where we are
if ($_POST) {
    $_SESSION['POST']=$_POST;
    redirect($_SERVER["REQUEST_URI"]);
}

//If there's something in the SESSION POST, move it back to the POST and clear the SESSION POST
if ($_SESSION['POST']) {
    $_POST=$_SESSION['POST'];
    unset($_SESSION['POST']);
}

Techniquement, vous n'avez même pas besoin de le remettre dans une variable appelée $ _POST. Mais cela m’aide à garder une trace des données d’où elles viennent.

2
rgbflawed

J'ai une application qui fournit une longue liste de paramètres à une page Web. Je dois donc utiliser POST au lieu de GET. Le problème est que lorsque la page est affichée et que l'utilisateur clique sur le bouton Précédent, Firefox affiche un avertissement:

Votre raisonnement est faux. Si la demande est sans effets secondaires, il devrait s'agir de GET. Si cela a des effets secondaires, cela devrait être POST. Le choix ne doit pas être basé sur le nombre de paramètres à passer.

1
troelskn

Une autre solution consiste à ne plus utiliser la redirection.

Vous pouvez traiter et afficher le résultat du traitement immédiatement sans alerte de confirmation POST. Vous devriez juste manipuler l'objet d'historique du navigateur:

history.replaceState("", "", "/the/result/page")

Voir Complet ou Court Réponses

0
Eugen Konkov