La fonction de connexion unique est toujours très importante dans les scénarios d'application réels. Logiquement, nous n'autorisons pas à un utilisateur d'effectuer deux opérations en même temps. Apprenons la mise en œuvre unique de SpringMVC.
L'intercepteur de SpringMVC est différent de l'intercepteur de Spring. SpringMVC a un Dispatcherservlet d'entrée unifié. Toutes les demandes passent par Dispatcherservlet, vous n'avez donc qu'à faire des histoires sur Dispatcherservlet. Le Dispatcherservlet n'a pas de proxy et le contrôleur géré par SpringMVC n'a pas de proxy.
1. Explorez d'abord un principe d'implémentation de base: cette fonction est relativement simple, c'est-à-dire qu'un seul utilisateur peut fonctionner sur le même projet Web en même temps, alors voici la découverte d'une connexion à distance, et deux chemins sont introduits ici. 1. Le serveur découvre que l'utilisateur connecté a effectué à nouveau l'opération de connexion via une autre IP, puis pousse activement un rappel pour dire au premier utilisateur de se connecter à la connexion à distance; 2. Lorsque l'utilisateur effectue des opérations, il constate que son compte a été supprimé et qu'il y a une connexion à distance. En ce qui concerne ces deux solutions, le premier est plus réel mais est toujours en cours d'exploration. Concentrons-nous sur la deuxième méthode ci-dessous.
2. La mise en œuvre du deuxième type est relativement simple. Il y a deux opérations. L'une consiste à ajouter un champ supplémentaire au SessionID de l'utilisateur pour stocker le SessionID de l'utilisateur connecté, car chaque demande de demande correspond à un sessionID unique unique. Ensuite, en utilisant la technologie interceptor, interceptant les opérations de l'utilisateur. Dans l'intercepteur, la demande URL pertinente sur la page de connexion est publiée pour la première fois, et l'autre est la demande de vérification de connexion est publiée. Enfin, filtrez l'utilisateur. (À propos de la connexion de l'utilisateur, lorsque la vérification est réussie, non seulement l'utilisateur doit être stocké dans la session pour la vérification de l'interception de connexion, mais aussi l'ID de session doit être stocké dans le SessionID correspondant dans le tableau d'utilisateurs.) Pour la demande de demande cette fois, vous pouvez obtenir la session et ensuite adopter le communiqué. Si la différence est, la connexion de saut hors ligne sera invitée à sauter dans la connexion, car il y aura une session dans une opération de serveur de connexion utilisateur. Tant que la session expire, l'ID de session de chaque opération initiée par l'utilisateur est la même, donc elle correspondra à l'ID stocké dans la base de données lors de la connexion. Lorsque quelqu'un d'autre passe par d'autres appareils, utilisez le même compte pour entrer. La session sera rétablie lors de la connexion. La session dans la base de données actualisera le SessionID dans la base de données, mais le SessionID est toujours inchangé. Cependant, la session dans la base de données a changé. Par conséquent, lors de la vérification si le SessionID dans la base de données est cohérent dans l'intercepteur, il ne parviendra pas à intercepter le fonctionnement de l'utilisateur pour atteindre la fonction de la connexion à utilisateur unique. (Une note sur la session, lorsque l'utilisateur se connecte d'abord au serveur, une session sera créée du côté du serveur, puis chaque opération initiée par l'utilisateur transportera l'ID de cette session, et certaines situations se produiront. L'utilisateur n'a pas fonctionné avec le serveur pendant longtemps. L'utilisateur se déconnecte et rend activement la session invalide. L'utilisateur ferme le solide ou reposait le serveur)
Ce qui suit est la mise en œuvre de l'intercepteur dans Springmvc
classe publique SingleUserInterceptor implémente HandlerInterceptor {@Autowiredprivate Userperper Mappen; public void afterCompletion (httpservletRequest arg0, httpservletResponse arg1, arg2, exception arg3) lance exception {// todo atenerated method tré HttpServletResponse arg1, objet arg2, modelandView arg3) lève une exception {// todo marde générée automatique Stub} public booléen pré-holle (httpservletRequest arg0, httpservletResponse arg1, objet arg2) lance l'exception {string url = arg0.getRequesturi (); // if (url.indexof ("login.jsp")> = 0 || url.indexof ("new / login")> = 0 || url.indexof ("checkuser")> = 0) {return true;} // si le nom d'utilisateur existe (c'est-à-dire, connexion et libération) user = (entier) arg0.getSession (). getAttribute ("user"); if (user! = null) {String SessionId = mAper.getUserentity (Integer.Valueof (User)). GetessionID (); if (sessionId.equals (arg0.getSession (). getID ())) {return true;} else {arg1.setstatus (arg1.sc_gateway_timeout); arg1.setContentType ("text / html; charset = utf-8"); printwriter out = arg1.getwriter (); out.println ("<html>"); out.println ("<cript>"); out.printLn ("votre compte Iscitède dans le scénario; Ailleurs, vous êtes obligé de vous déconnecter ') "); out.println (" window.open (' "+ arg0.getContextPath () +" /new/login' ,'_top') ;") ;out.println--"<</script>") ;out.println (" à/html>)</script>"); arg0.getRequestDispatcher ("login.jsp").Le code ci-dessus peut réaliser que la fonction du premier utilisateur connecté est supprimé de la ligne lorsque le même utilisateur se connecte plusieurs fois. Il peut réaliser la fonction d'inciter le compte à se connecter à distance, puis de passer à la page de connexion. Ici, nous devons expliquer les points clés de cette fonction invite d'alerte simple. Si cette alerte doit apparaître, elle doit pouvoir mettre fin à la demande. Ensuite, la fonction d'impression de réponse sortira l'instruction de l'invite d'alerte, donc l'instruction JUMP commentée ne peut pas exister. S'il y en a, l'instruction d'invite d'alerte ne sera pas publiée, car votre opération ne se termine pas correctement mais est transmise ou redirigea vers d'autres opérations. Qu'il soit correct ou non, il sera sorti des autres actions à la page, donc votre instruction d'impression de réponse n'apparaîtra pas. Donc, la bonne façon est: la demande d'interception n'est pas publiée (returnfalse), et la demande est toujours la demande d'origine et ne sautera pas. Les informations d'impression de la réponse à la page peuvent être affichées. Quant à sauter sur la page de connexion, vous pouvez utiliser: out.println ("window.open ('" + arg0.getContextPath () + "/ new / ligin', '_ top');"); Pour implémenter qu'une demande d'action est exécutée dans une section de la sortie JS par la réponse, pointant vers la page de connexion.
Le code ci-dessus a été essentiellement considéré comme une seule fonction de connexion utilisateur, mais vous constaterez que le fonctionnement de la demande AJAX ne pointe pas vers la page de connexion lors de la connexion à distance et il n'y a pas d'informations rapides. Permettez-moi d'expliquer la raison en premier, car votre Ajax fait une demande asynchrone, et l'URL demandée est également appariée dans le mappeur du processeur, il sera donc considéré comme la demande est réussie (le code d'état de retour est 200). L'instruction JS imprimée dans la réponse ci-dessus deviendra la demande réussie de réussite et la valeur de retour. Vous pouvez essayer de commenter la phrase ci-dessus: arg1.setstatus (arg1.sc_gateway_timeout); Pour le moment, certaines autres opérations doivent être effectuées. Le premier est l'instruction arg1.setstatus (arg1.sc_gateway_timeout); Sa fonction est de définir le code d'état renvoyé par réponse. Les paramètres ci-dessus indiquent que le code d'état 504 sera retourné pour représenter une erreur de demande. Pour le moment, la demande AJAX ne répondra plus dans la méthode de réussite, mais répondra à la méthode d'erreur AJAX. Par conséquent, il vous suffit d'exécuter la méthode correspondante dans l'erreur AJAX, par exemple:
$ .ajax ({url: 'new / msd2', succès: fonction (a) {alert (a);}, error: function (rs) {if (rs.status == 504) {document.write (rs.Responsext);}}});Lorsque la demande AJAX est interceptée en raison d'une connexion distante, définissez arg1.setstatus (arg1.sc_gateway_timeout); L'état de retour de la demande peut être modifié à 504. Ensuite, la méthode d'erreur répond. Lorsqu'il est déterminé que l'état est le code d'état que vous définissez, document.write (Rs.ResponSeText); ResponseText est l'instruction JS imprimée à la réception de l'intercepteur. Pour que ces déclarations soient exécutées, le document.write (); La méthode doit écrire le code sur le DOM pour le faire prendre effet. À ce stade, toutes les demandes et connexion unique pour les demandes AJAX asynchrones ont été essentiellement implémentées.
Laissez cet article uniquement pour enregistrer le code clé, les idées et les principes d'opérations
Résumer
Ce qui précède est tout au sujet de la mise en œuvre d'une connexion unique dans SpringMVC Interceptor, j'espère que cela sera utile à tout le monde. S'il y a des lacunes, veuillez laisser un message pour le signaler. Merci vos amis pour votre soutien à ce site.