Este artículo describe la simple implementación del ahorro de la sesión de Java en Redis. Compártelo para su referencia, como sigue:
En el equilibrio de carga, si el usuario accede a una máquina diferente y no realiza una sincronización de sesión, se le preguntará al usuario, lo cual es muy malo para la experiencia del usuario, por lo que es muy necesario que realicemos una sincronización de sesión. Ponga la sesión en el servidor de caché Reids puede resolver bien el problema. La siguiente es una implementación simple del código.
1. Configure el filtro web.xml:
<filter> <filter-name> sessionFilter </filter-name> <filter-class> org.springframework.web.filter.delegatingfilterproxy </filter-class> </filtre> <filter-mapping> <filter-name> sessionfilter </filtre-name> <url-pattern>/*</ url-pattern> <////filer-name> sessionFilter </filtre-name> <url-pattern>/*</ url-pattern> <////filter-name> sessionFilter </filtre-name> <url-pattern>/*</ url-pattern> <////filer-name> sessionFilter </filter-name> <url-pattern>/*</ url-pattern> </////mapping>
2. Configure el nombre del filtro correspondiente:
<bean id = "sessionFilter"> <Property name = "redistemplate" ref = "redistemplate"/> </bean>
Implementación de SessionFilter:
Public Class SessionFilter extiende GenericFilterBean {private redistemplate redistemplate; @Override public void dofilter (solicitud de servletRequest, respuesta de servicio de servicio, cadena de filtro de filtro) lanza ioexception, servletException {system.out.println ("filtro"); HttpservletRequest re = (httpservletRequest) solicitud; HttpservletResponse Res = (httpservletResponse) respuesta; TerryhttPservletRequestWrapper WRAPPER = new TerryHttPservletRequestWrapper (RE, Res, Redistemplate); Chain.dofilter (envoltorio, respuesta); } public redistemplate getRedistEmplate () {return redistemplate; } public void setRedistEmplate (redistemplate redistemplate) {this.redistemplate = redistemplate; }}4. Implementación de TerryhttpservletRequestWrapper:
clase pública TerryhttpservletRequestWrapper extiende httpservletRequestWrapper {sesion private cachehttpsession; Respuesta privada httpservletResponse; PRIVADO REDISTEPLAPLACIÓN REDISTEPLAPLACIÓN; public terryhtpservletRequestWrapper (solicitud httpservletRequest, respuesta httpservletreSponse, redistemplate redistemplate) {super (request); this.redistemplate = respuesta; this.redistemplate = redistemplate; } @Override public httpsession getSession (boolean create) {if (session! = Null) {return session; } Cadena sid = "Terry" + System.CurrentTimemillis (); WriteIdTocookie (Sid); sesión = nueva cachehttpsession (null, sid, redistemplate); sesión de regreso; } @Override public httpsession getSession () {return getSession (falso); } Proteged void witesIdTocookie (String sid) {cookie mycookies = new Cookie ("Terry", Sid); mycookies.setMaxage (-1); mycookies.setDomain ("locahost"); mycookies.setPath ("/"); Response.AddCookie (mycookies); }}5. Implementación de Cachehttpsession:
clase pública cachehttpsession se extiende httpsessionwrapper {private string sid; PRIVADO REDISTEPLAPLACIÓN REDISTEPLAPLACIÓN; Stringserializer privado StringDredisSerialer = new StringRedisSerializer (); public cachehttpsession (Httpsession Session, String SID, redistemplate redistemplate) {super (session); this.sid = sid; this.redistemplate = redistemplate; } @Suppleswarnings ("sin verificar") @Override public enumeración <String> getAttributeNames () {final byte [] key = stringserializer.serialize (sid); Resultado del objeto = redistemplate.execute (nuevo redisCallback <pectus> () {@Override Public Object doinredis (Redisconnection Connection) lanza DataCessexception {set <byte []> set = conexión.keys (key); return set;}}); if (resultado! = null) {set <byte []> s = (set <byte []>) resultado; Establecer <String> ss = new Hashset <String> (); para (byte [] b: s) {ss.Add (Stringserializer.deserialize (b)); } Enumeración <string> en = new Vector (SS) .Elements (); regresar es; } return null; } @Suppleswarnings ("sin verificar") @Override public void setAttribute (name de cadena, valor de objeto) {final byte [] key = stringserializer.serialize (name); Byte final [] v = Stringserializer.Serialize ((String) Value); redistemplate.execute (new Rediscallback <SPEt> () {@Override Object Public Doinredis (Redisconnection Connection) lanza DataAccessException {Connection.set (Key, V); return null;}}); } @Override Public Object getAttribute (name de cadena) {final byte [] key = stringserializer.serialize (nombre); @SupessWarnings ("Unchecked") Object Value = redistemplate.Execute (new Rediscallback <SPET> () {@Override Public Object doinredis (Redisconnection Connection) lanza DataCcessexception {return Connection.get (Key);}}); valor de retorno; } @Override public String getId () {return sid; }}6. Implementación de httpsessionwrapper:
clase pública httpsessionwrapper implementa httpsession {session private httpsession; public httpsessionwrapper (session httpsession) {this.session = session; } @Override public Long GetCreationTime () {return this.session.getCreationTime (); } @Override public String getId () {return this.session.getId (); } @Override public Long getLastAccessTtime () {return this.session.getLastacCeSttime (); } @Override public ServletContext getServletContext () {return this.session.getServletContext (); } @Override public void setmaxinactiveInterval (int interval) {this.session.setMaxInactiveInterval (intervalo); } @Override public int getMaxInactiveInterval () {return this.session.getMaxInactiveInterval (); } @Override public httpsessionContext getSessionContext () {return this.session.getSessionContext (); } @Override Public Object getAttribute (name de cadena) {return this.session.getAttribute (nombre); } @Override Public Object getValue (nombre de cadena) {return this.session.getValue (nombre); } @Override public enumeración <String> getAttributeNames () {return this.session.getAttributeNames (); } @Override public String [] getValueNames () {return this.session.getValueames (); } @Override public void setAttribute (name de cadena, valor de objeto) {this.session.setattribute (nombre, valor); } @Override public void putValue (nombre de cadena, valor de objeto) {this.session.putValue (nombre, valor); } @Override public void RemoveAttribute (name de cadena) {this.session.RemoveAttribute (nombre); } @Override public void RemoLEValue (nombre de cadena) {this.session.RemoveValue (nombre); } @Override public void invalidate () {this.session.invalidate (); } @Override public boolean isNew () {return this.session.isnew (); }}El código anterior puede guardar la sesión en Redis. Por supuesto, hay muchos problemas, como la generación de SessionId, la sesión pasada, la serialización del objeto (la prueba usa cadena para conveniencia) y muchos otros problemas. Lo mejoraré más tarde si tengo tiempo.
Para obtener más información sobre el contenido relacionado con Java, consulte los temas de este sitio: "Java+MySQL Database Programming Resumen", "Java Operation Excel Skills Resumen", "Estructura de datos de Java y tutorial de algoritmo", "Java y Summary de Operación de Operaciones de Directorio" y "Summar de las habilidades de Operación Dom Nodos de Java" Summary "
Espero que este artículo sea útil para la programación Java de todos.