Comment détecter si l'utilisateur d'ouvrir deux onglets pour une même session?
J'ai fait une demande de réservation effectuée à l'aide de CakePHP qui implique quelques étapes avant la page de paiement. Entre ces étapes que j'ai stocker les informations dans la session.
Comment il fonctionne, c'est que l'Étape 1 exige d'eux de remplir leurs informations. Lorsque vous allez à l'Étape 2, l'information dans l'Étape 1 sera enregistrée dans l'objet session. À mesure qu'ils avancent dans les autres étapes, le processus se répète. À la fin, lorsqu'ils finalisation de la commande, toutes les données sont alors 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'ils ont une autre page ou un autre onglet ouvert pour la même application dans le même navigateur, le problème se pose.
Disons qu'elles ont deux instance de l'application ouverte dans Un Onglet et Onglet B. Dans l'Onglet Une ils sont entrés dans les détails de l'Étape 1 et passez à l'Étape 2. Ensuite, l'utilisateur fait la même chose dans l'Onglet B.
À la dernière étape, lorsque l'utilisateur effectue un paiement, les informations dans l'Onglet d'Un est la même que dans l'Onglet B.
Maintenant, je ne peux que penser à la meilleure façon est d'empêcher l'utilisateur de l'ouverture de l'application même dans les deux instance du navigateur.
Est-il un moyen de détecter et invite l'utilisateur à remplir le formulaire de réservation dans l'Onglet de premier quand ils essaient d'ouvrir un autre exemple dans l'Onglet B?
Vous devez vous connecter pour publier un commentaire.
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 a commencé lors de l'étape 1 est commencé. Assurez-vous que côté serveur qu'ils suivent le droit étapes (c'est à dire qu'ils ne peuvent pas revenir à l'étape 1 après l'étape 1 a été complété, à moins qu'ils spécifiquement cliquez sur un lien pour le faire.) Fondamentalement, le suivi de leur étape en cours sur le serveur et le mettre à jour au besoin. Dans le cas où l'utilisateur fait quelque chose d'inattendu, vous pourriez leur donner la possibilité de recommencer.
Je me demandais si les champs cachés avec des horodatages sur vos formulaires peuvent vous aider. Un peu la même idée.
Mise en garde: ce processus peut casser l'essence de bouton précédent de votre navigateur. Je me déteste pour laisser ça arrive dans un de mes projets.
Pour la croix-prise en charge du navigateur, vous devez l'avoir associé à un compte d'utilisateur ou de quelque chose qui persiste.
Sûr, vous pouvez réaliser cela avec un côté client poller script. En JavaScript, vous pouvez générer un ID de fenêtre qui peut être n'importe quoi tant que sa garantie unique. Ont le JS faire de l'Ajax appelants à un point de terminaison sur le serveur qui ne fait rien, mais comparer les Id de session et des. À tout moment, si vous avez deux différents "windowID" valeurs", vous savez qu'ils ont d'avoir à ouvrir de windows pour la même session.
Vous pouvez stocker ce côté serveur comme un tableau dans la session ou vous pouvez même stocker entièrement sur le côté client dans un cookie. Si vous choisissez de le faire, de votre côté client poller serait-il suffit de regarder la valeur du cookie et si elle contient deux valeurs différentes, quelque chose cloche. Les Cookies sont un peu moins idéal, car ils ajoutent du poids à la demande/réponse de cycle et que vous souhaitez paramétrer un mécanisme pour effacer la valeur de la page lorsque l'utilisateur décharge la page.
Pour le côté serveur de mise en œuvre, vous n'avez qu'à envoyer le courant windowID avec lien ou poster pour que le serveur peut effacer le windowID de la session. Rien de tout cela permettrait de protéger contre l'utilisateur ayant une session Firefox et Chrome session ouverte à la fois, bien que.
Comme Benjamin l'a souligné, ce faire, vous pouvez venir avec un par-ID de fenêtre qui vous fait ensuite rapport au serveur à chaque requête. Si vous souhaitez activer la fenêtre multiple de cas d'utilisation, je pense que c'est le plus raisonnable.
Je ne pense pas que vous avez besoin pour interroger le serveur via ajax pour faire cela. Aussi longtemps que chaque requête au serveur inclut l'ID de fenêtre, vous pouvez lever l'ambiguïté de ce qu'session sur le serveur, afin d'associer la demande. Cela signifie que votre code côté serveur a changer pour inclure l'ID de fenêtre dans le cadre de la session.
Cependant, cette approche a de graves inconvénients. Par exemple, si l'utilisateur ferme à la fois Tab et la languette B, puis ouvre un nouvel Onglet C... ce qui se passe? Le jeu de données devraient-ils renouer avec?
L'approche de la restriction de l'utilisateur pour un seul onglet sons assez raisonnable si vous avez besoin pour empêcher le mélange de plusieurs onglets vaut de l'etat.
Vous pouvez le faire via le Local de Stockage, btw. Si vous générez un ID aléatoire sur le client et le pousser dans le Stockage Local via un appel comme
window.localStorage.setItem('window_id', <my_random_id_here>);
ensuite, vous pouvez vérifier cette valeur au chargement de la page. Si la valeur existe lorsque le chargement de la page, vous avez une belle indicateur clair qu'au moins une autre fenêtre est ouverte. Vous devrez assurez-vous de supprimer cette valeur sur la page décharger, sinon des séances de morts pourrait déclencher de faux positifs.