Cet article décrit la mise en œuvre simple de l'épargne de la session Java à Redis. Partagez-le pour votre référence, comme suit:
Dans l'équilibrage de charge, si l'utilisateur accède à une machine différente et n'effectue pas de synchronisation de session, l'utilisateur sera demandé, ce qui est très mauvais pour l'expérience utilisateur, il est donc très nécessaire pour nous d'effectuer la synchronisation de session. Mettez la session sur le serveur de cache Reids peut bien résoudre le problème. Ce qui suit est une simple implémentation du code.
1. Configurez le filtre Web.xml:
<filter> <filter-name> SessionFilter </ Filter-Name> <Filter-Class> org.springframework.web.filter.delegatingFilterProxy </ Filter-Class> </ Filter> <Url-Mapping> <filter-name> SessionFilter </ Filter-Name> <Url-Patter> / * </ url-Pattern>
2. Configurez le nom du filtre correspondant:
<bean id = "SessionFilter"> <propriété name = "redetemplate" ref = "redesttemplate" /> </bant>
Implémentation de SessionFilter:
Classe publique SessionFilter étend GenericFilterBean {private redetemplate reidemplate; @Override public void dofilter (ServLetRequest Request, ServletResponse Response, filterChain chaîne) lève IOException, servlexception {System.out.println ("filter"); HttpServLetRequest re = (httpServleRequest); HttpServletResponse Res = (httpServletResponse) Réponse; TerryhTTPServletRequestWrapper Wrapper = new TerryHttPServleRequestwrapper (Re, Res, Redemplate); chaîne.Dofilter (wrapper, réponse); } public redesttemplate getRedistEemplate () {return reidemplate; } public void setRedistemplate (reidemplate redesttemplate) {this.redistemplate = reidemplate; }}4. Implémentation de TerryhTTPServletRequestwrapper:
classe publique TerryHTTPServletRequestwrapper étend httpservletRequestwrapper {private cachehttpSession session; Réponse privée HttpServletResponse; Redemplate privé Redemplate; public TerryHTTPServletRequestwrapper (demande httpServletRequest, réponse httpservletResponse, redemplate reidemplate) {super (request); this.redistemplate = réponse; this.redistemplate = reidemplate; } @Override public httpSession getSession (boolean create) {if (session! = Null) {return session; } String sid = "Terry" + System.currentTimeMillis (); Écrituredtocookie (SID); Session = new CachehTTPSession (NULL, SID, REDISTETTEMPLATE); Session de retour; } @Override public httpSession getSession () {return getSession (false); } VOID ProTTED WIRETESIDTOCOOKIE (String Sid) {Cookie Mycookies = new Cookie ("Terry", Sid); Mycookies.setMaxage (-1); Mycookies.setDomain ("Locahost"); mycookies.setPath ("/"); réponse.addcookie (mycookies); }}5. Mise en œuvre de CachehttpSession:
Classe publique CachehTTPSession étend httSSessionwrapper {private String Sid; Redemplate privé Redemplate; private stringRedisSerializer stringserializer = new StringRedisSerializer (); CACHEHTTPSESSION PUBLIQUE (HttpSession Session, String Sid, Redemplate Redemplate) {Super (session); this.sid = sid; this.redistemplate = reidemplate; } @SuppressWarnings ("Unchecked") @Override Public Enumeration <string> getAttributeNames () {final byte [] key = stringSerializer.serialize (sid); Objet result = reditemplate.Exécute (new redisCallback <objet> () {@Override Object DoinRedis (connexion Redisconnection) lève DataAccessException {set <byte []> set = connection.keys (key); return set;}}); if (result! = null) {set <byte []> s = (set <byte []>) résultat; Set <string> ss = new hashSet <string> (); pour (octet [] b: s) {ss.add (stringSerializer.deserialize (b)); } Énumération <string> en = nouveau vecteur (ss) .Elements (); retourne fr; } return null; } @SuppressWarnings ("Unchecked") @Override public void setAttribute (nom de chaîne, valeur de l'objet) {byte final [] key = stringSerializer.serialize (name); octet final [] v = stringSerializer.serialize (((String) Value); Redistetemplate.Exécute (New RedisCallback <objet> () {@Override Public Object Doinredis (Redisconnection Connection) lève DataAccessException {Connection.Set (Key, v); return null;}}); } @Override Public Object GetAttribute (String Name) {Final Byte [] key = stringSerializer.Serialize (name); @SuppressWarnings ("Unchecked") Object Value = redestEmplate.execute (new RedisCallback <objet> () {@Override public objet doInredis (Redisconnection Connection) lève DataAccessException {return Connection.get (key);}}); valeur de retour; } @Override public String getID () {return sid; }}6. Implémentation de HttSessionwrapper:
La classe publique HttSSessionwrapper implémente HttpSession {Session privée httpSession; public httpSessionwrapper (HttpSession Session) {this.Session = session; } @Override public long getCreationTime () {return this.Session.getCreationTime (); } @Override public String getID () {return this.session.getId (); } @Override public long getLastAccessEdTime () {return this.Session.getLastAccessSedTime (); } @Override public ServletContext getServletContext () {return this.Session.getServletContext (); } @Override public void setMaxInactiveInterval (int interval) {this.Session.setMaxInactiveInterval (interval); } @Override public int getMaxInactiveInterval () {return this.Session.getMaxInactiveInterval (); } @Override public httSessionContext getSessionContext () {return this.session.getSessionContext (); } @Override Public Object GetAttribute (String Name) {return this.Session.getAttribute (name); } @Override public objet getValue (String name) {return this.Session.getValue (name); } @Override Public Enumeration <string> getAtTrributeNames () {return this.Session.getAttributeNames (); } @Override public String [] getValueNames () {return this.Session.getValuEnames (); } @Override public void setAttribute (nom de chaîne, valeur de l'objet) {this.Session.SetAttribute (nom, valeur); } @Override public void putValue (nom de chaîne, valeur de l'objet) {this.Session.putValue (nom, valeur); } @Override public void removeAtTribute (name de chaîne) {this.Session.RemoveAtTribute (nom); } @Override public void removeValue (String Name) {this.Session.RemoveValue (name); } @Override public void invalidate () {this.Session.invalidate (); } @Override public boolean isnew () {return this.Session.isnew (); }}Le code ci-dessus peut enregistrer la session sur Redis. Bien sûr, il existe de nombreux problèmes, tels que la génération de sessionID, la session passée, la sérialisation des objets (le test utilise la chaîne pour la commodité) et de nombreux autres problèmes. Je l'améliorerai plus tard si j'ai le temps.
Pour plus d'informations sur le contenu lié à Java, veuillez consulter les sujets de ce site: "Java + MySQL Database Programming Résumé", "Java Operation Excel Skills Résumé", "Java Data Structure et" Tutorial de l'algorithme ", Scaptiel Java File and Directory Operation Skinky" et "Java Operation Dom Node Résumé"
J'espère que cet article sera utile à la programmation Java de tous.