J'ai fait une application de réservation en utilisant CakePHP qui implique quelques étapes avant la page de paiement. Entre ces étapes, je stocke les informations dans la session.
Comment ça marche est que l'étape 1 les oblige à remplir leurs informations. Lorsque vous passez à l'étape 2, les informations de l'étape 1 sont enregistrées dans l'objet de session. Au cours des autres étapes, le processus se répète. À la fin de leur paiement, toutes les données sont ensuite enregistrées dans la base de données.
Tout fonctionne très bien si l'utilisateur ouvre une instance de l'application dans le navigateur. Mais une fois qu'une autre page ou un autre onglet est ouvert pour la même application dans le même navigateur, le problème se produit.
Supposons que deux instances de l'application soient ouvertes dans les onglets A et B. Dans l'onglet A, ils ont saisi les détails à l'étape 1 et passent à l'étape 2. Ensuite, l'utilisateur fait la même chose dans l'onglet B.
À la dernière étape lorsque l'utilisateur effectue une commande, les informations de l'onglet A sont les mêmes que celles de l'onglet B.
À l'heure actuelle, je ne peux que penser que le meilleur moyen consiste à empêcher l'utilisateur d'ouvrir la même application dans deux instances de navigateur.
Existe-t-il un moyen de détecter et de demander à l'utilisateur de remplir le formulaire de réservation dans l'onglet A en premier lorsqu'il tente d'ouvrir une autre instance dans l'onglet B?
1. Le même problème (et la solution): https://sites.google.com/site/sarittechworld/track-client-windows
2.Vous pouvez envoyer des informations par POST ou GET
Vous pouvez marquer une session comme étant lancée lors du premier démarrage de l'étape 1. Assurez-vous que les serveurs suivent les bonnes étapes (c’est-à-dire qu’ils ne reviennent pas à l’étape 1 une fois celle-ci terminée, à moins qu’ils cliquent sur un lien pour le faire.) En gros, suivez leur étape actuelle sur le serveur et mettez-la à jour. comme requis. Si l'utilisateur fait quelque chose d'inattendu, vous pouvez lui donner la possibilité de recommencer.
Je me demande si des champs cachés avec des horodatages sur vos formulaires pourraient vous aider. Un peu la même idée cependant.
Mise en garde: ce processus peut casser l'essence du bouton de retour de votre navigateur. Je me déteste de laisser cela se produire dans l'un de mes projets.
Pour prendre en charge plusieurs navigateurs, vous devez l'associer à un compte d'utilisateur ou à un élément persistant.
Bien sûr, vous pouvez y parvenir avec un script d'interrogation côté client. En JavaScript, vous pouvez générer un identifiant de fenêtre qui peut être n'importe quoi pourvu qu'il soit garanti d'être unique. Demandez au système JS de faire en sorte que les appelants Ajax se rendent sur un noeud final du serveur ne faisant que comparer les identifiants et la session. A tout moment, si vous avez deux valeurs "windowID" différentes, vous savez qu'elles doivent ouvrir des fenêtres pour la même session.
Vous pouvez stocker ceci du côté serveur en tant que tableau dans la session ou même le stocker entièrement du côté client dans un cookie. Si vous choisissez de le faire, votre interrogateur côté client se contentera de regarder la valeur du cookie et s’il contient deux valeurs différentes, quelque chose ne va pas. Les cookies sont toutefois un peu moins idéaux car ils ajoutent du poids au cycle de demande/réponse et vous devez configurer un mécanisme pour effacer la valeur de la page en cours lorsque l'utilisateur décharge la page.
Pour l'implémentation côté serveur, il vous suffira d'envoyer le windowID actuel avec link ou post pour que le serveur puisse effacer le windowID de la session. Toutefois, rien de tout cela ne protège contre la possibilité pour l'utilisateur de disposer d'une session Firefox et d'une session Chrome en même temps.
Comme Benjamin l'a souligné, vous pouvez le faire en fournissant un ID par fenêtre que vous rapporterez ensuite au serveur à chaque demande. Si vous souhaitez activer le cas d'utilisation de plusieurs fenêtres, je pense que c'est l'approche la plus raisonnable.
Je ne pense pas que vous ayez besoin d'interroger le serveur via ajax pour le faire cependant. Tant que chaque demande adressée au serveur inclut l'ID de fenêtre, vous pouvez déterminer à quelle session du serveur associer la demande. Cela signifie que votre code côté serveur doit changer pour inclure l'ID de fenêtre dans le cadre de la session.
Cependant, cette approche présente de graves inconvénients. Par exemple, si l'utilisateur ferme les onglets A et B, puis ouvre un nouvel onglet C ... que se passe-t-il? Avec quel jeu de données doivent-ils se reconnecter?
L’approche consistant à restreindre l’utilisateur à un seul onglet semble bien raisonnable si vous devez empêcher l’interaction de plusieurs onglets.
Vous pouvez le faire via Stockage local, au fait. Si vous générez un identifiant aléatoire sur le client et que vous le placez dans le stockage local via un appel tel que window.localStorage.setItem('window_id', <my_random_id_here>);
, vous pouvez vérifier cette valeur lors du chargement de la page. Si la valeur existe lors du chargement de la page, vous avez un indicateur assez clair qu'au moins une autre fenêtre est ouverte. Assurez-vous de supprimer cette valeur lors du déchargement de la page, sinon des sessions inactives risquent de provoquer des faux positifs.