Récemment, j'écrivais un site Web d'achat de livres. Lorsque vous testez la fonction de déconnexion, en cliquant sur le navigateur pour revenir pour actualiser le navigateur, vous constaterez que l'utilisateur qui s'était déjà déconnecté s'est recouvert.
Après avoir réfléchi depuis longtemps, j'ai trouvé de nombreuses solutions en ligne, mais la plupart des méthodes données en ligne sont d'utiliser JS pour déconnecter et interdire aux utilisateurs de cliquer sur le navigateur pour revenir.
Bien que cette méthode soit possible, elle ne résout pas vraiment ce problème en arrière-plan. C'est comme gardant contre les messieurs mais pas les méchants.
Ce qui suit est la méthode que vous avez implémentée
principe:
Après vous être connecté, cliquez sur le navigateur pour revenir pour actualiser le navigateur. En fait, le navigateur rend les informations du formulaire d'origine.
Se déconnecter signifie tuer la session originale
// déconnectez la déconnexion privée de void (demande httpsservletRequest, réponse httpservletResponse) lève ServletException, ioException {httpSession session = request.getSession (); request.setAttribute ("SessionId", session.getId ()); session.RemoveAttribute ("utilisateur"); session.invalidate (); réponse.SendRedirect (request.getContextPath () + "/Index.jsp"); } Lors de la redirection vers une page JSP après la déconnexion, la session générée est différente de la session d'origine (la session de la page JSP est activée par défaut)
C'est-à-dire, après s'être déconnecté, cliquer sur le navigateur pour revenir pour actualiser la session est une nouvelle session. De ce point de vue, pensez à la solution.
J'ai mis un élément de données dans la session d'origine. Je peux obtenir ces données pour la première fois lorsque je me suis connecté. Après vous être connecté, la session d'origine a disparu. Cliquez sur le navigateur pour revenir à actualiser. Il n'y a pas de données dans la nouvelle session. La valeur obtenue est nul
Faites correspondre les données de la session d'origine avec la nouvelle valeur de session. L'un a une valeur et l'autre est nul. Le correspondant échouera certainement. Pour le moment, vous pouvez donner une invite conviviale et laisser l'utilisateur se connecter à nouveau.
Alors, comment les données de la session d'origine peuvent-elles être enregistrées après la déconnexion (si la session d'origine est annulée, elle aura disparu)? Envisagez d'ajouter un domaine caché au formulaire et mettez les données de la session d'origine dans le domaine caché. Après vous être connecté, cliquez sur le navigateur pour revenir à actualiser. Le navigateur soumettra automatiquement les données de la session d'origine sans l'enregistrer manuellement (en fait, l'économie manuelle peut devoir être placée dans le contexte de l'application ServletContext, et je ne l'ai jamais essayé)
Un peu similaire à une solution aux soumissions répétées de formulaires, mais les données de la session d'origine ne peuvent pas être éliminées ici, car la même session n'est pas la même session avant et après déconnexion.
Les détails sont les suivants: dans Login.jsp
<% String token = new random (). NextLong () + ""; session.setAttribute ("token", token);%> <form action = "$ {pageContext.request.contextPath} / servlet / clientServlet? Operation = login" method = "post"> <table name = "name"> </ td> </ tr> <tr> <td align = "droite"> mot de passe: </td> <td> <entrée type = "mot de passe" name = "mot de passe"> </ td> </ tr> <tr> <td> </td> <td> <entrée type = "Soumis" Value = "Login"> </td> </tr> </prôle> <put-type = "Login"> </td> </tr> </prant> name = "token" value = "$ {Sessionscope.Token}"> </ form> Dans le servlet, donnez une invite amicale et redirigez vers la page de connexion
HttpSession session = request.getSession (); // Résolvez le problème de la connexion répétée du navigateur après avoir enregistré // Donnez un champ de saisie caché et obtenez la valeur du domaine caché en arrière-plan // Rafraîchir le navigateur après la connexion générera une nouvelle session, de sorte que la sessionToken soit obtenue comme nul // So Hiddentoken.Equals (sessiont) doit être une session de fausse chaîne. String Hiddentoken = request.getParameter ("token"); if (! Hiddentoken.equals (sessionToken)) {request.setAttribute ("Message", "Vous vous êtes déconnecté, veuillez vous connecter à nouveau et se tourner vers la page de connexion après 2 secondes <Meta Http-Equiv = 'REFRESS' Content = 2; url =" + request.getContextPath () + "/Client/login.jsp>"); request.getRequestDispatcher ("/ client / message.jsp"). Forward (demande, réponse); retour; } test:
Se connecter
Après vous être connecté, cliquez sur le navigateur pour revenir à actualiser. Le navigateur incitera à renvoyer les données.
Cliquez pour renvoyer
Cela résout le problème de cliquer sur le navigateur pour revenir pour actualiser l'utilisateur et se connecter à nouveau après la déconnexion.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.