Este artigo descreve a simples implementação da salvamento da sessão de Java para Redis. Compartilhe -o para sua referência, como segue:
No balanceamento de carga, se o usuário acessar uma máquina diferente e não executar a sincronização da sessão, o usuário será solicitado, o que é muito ruim para a experiência do usuário, por isso é muito necessário executar a sincronização da sessão. Coloque a sessão no servidor Reids Cache pode resolver bem o problema. A seguir, é apresentada uma implementação simples do código.
1. Configure o filtro web.xml:
<filter> <filter-name> sessionfilter </filter-name> <filter-Class> org.springframework.web.filter.delegatingFilterProxy </filter-class> </filter> <filter-Mapping> <filter-name> sessionfilter </filter-name/<-serern>/*</url-pnter>
2. Configure o nome do filtro correspondente:
<bean id = "sessionfilter"> <propriedade name = "redistemplate" ref = "redistemplate"/> </i bean>
Implementação do SessionFilter:
classe pública sessionfilter estende o genericFilterBean {private redistemplate redistemplate; @Override public void Dofilter (Solicitação de servletRequest, resposta servletResponse, cadeia de filtragem) lança ioexception, servletexception {System.out.println ("filtro"); HttpServletRequest RE = (httpServletRequest) solicitação; HttpServletResponse res = (httpServletResponse); TerryhttpServletRequestWrapper Wrapper = new TerryhttpServletRequestWrapper (re, res, Redistemplate); Chain.Dofilter (invólucro, resposta); } public redistemplate getredistemplate () {return redistemplate; } public void Setredistemplate (redistemplate redistemplate) {this.redistemplate = redistemplate; }}4. Implementação de TerryhttpServletRequestWrapper:
classe pública TerryhttpServletRequestWrapper estende HttpServLeTrequestWrapper {Sessão privada de cachehttpsession; Resposta privada de HttpServletResponse; private redistemplate redistemplate; public TerryHttPServletReQuestWrapper (solicitação httpServletRequest, resposta httpServletResponse, redistemplate redistemplate) {super (request); this.redistemplate = resposta; this.redistemplate = redistemplate; } @Override public httpSession getSession (boolean crie) {if (session! = Null) {retorna sessão; } String sid = "Terry" + System.CurrentTimEmillis (); writesidtocookie (SID); sessão = novo cachehttpSession (null, sid, redistemplate); sessão de retorno; } @Override public httpSession getSession () {return getSession (false); } Void protegido WritesidTocookie (String sid) {Cookie mycookies = new Cookie ("Terry", Sid); mycookies.setMaxage (-1); mycookies.setDomain ("LocaHost"); mycookies.setPath ("/"); resposta.addcookie (mycookies); }}5. Implementação de CacheHttpSession:
classe pública CachehttpSession estende httpSessionWrapper {private string sid; private redistemplate redistemplate; private stringRedisserializer stringSerializer = new StringRedisSerializer (); public cachehttpSession (sessão httpsession, string sid, redistemplate redistemplate) {super (sessão); this.sid = sid; this.redistemplate = redistemplate; } @Suppresswarnings ("desmarcado") @Override Public Enumeração <String> getAttributenames () {final byte [] key = stringSerializer.Serialize (SID); Resultado do objeto = redistemplate.execute (novo Rediscallback <ject> () {@Override public Object doinredis (conexão de redisconnection) lança dataAccessException {set <byte []> set = Connection.keys (key); retornar set;}}}); if (resultado! = null) {set <byte []> s = (set <byte []>) resultado; Set <string> ss = new HashSet <String> (); para (byte [] b: s) {ss.add (stringSerializer.DeSerialize (b)); } Enumeração <String> EN = new Vector (SS) .Elements (); retornar en; } retornar nulo; } @Suppresswarnings ("desmarcado") @Override public void setAttribute (nome da string, valor do objeto) {final byte [] key = stringSerializer.Serialize (nome); Final byte [] v = stringSerializer.Serialize ((String) valor); Redistemplate.execute (novo Rediscallback <Becut> () {@Override public Object doinredis (conexão de redisconnection) lança dataAccessException {Connection.Set (key, v); return null;}}); } @Override Public Object getAttribute (nome da string) {final byte [] key = stringSerializer.Serialize (nome); @Suppresswarnings ("desmarcado") Valor do objeto = redistemplate.execute (novo rediscallback <ject> () {@Override public Object doinredis (conexão de redisconnection) lança dataAccessException {return Connection.get (key);}}); valor de retorno; } @Override public String getId () {return sid; }}6. Implementação de HttpSessionWrapper:
classe pública httpsessionwrapper implementa httpssession {sessão privada httpsession; public httpSessionWrapper (sessão httpSession) {this.session = session; } @Override public Long getCreationTime () {return this.Session.GetCreationTime (); } @Override public String getId () {return this.session.getId (); } @Override public Long getLastAccedTime () {return this.session.getLastAccedTime (); } @Override public servletContext getServletContext () {return this.session.getServletContext (); } @Override public void setMaxinActiveInterVal (interval int) {this.session.setMaxinActiveInterval (intervalo); } @Override public int getMaxinActiveInterval () {return this.session.getMaxinActiveInterval (); } @Override public httpSessionContext getSessionContext () {return this.session.getSessionContext (); } @Override public Object getAttribute (nome da string) {return this.session.getAttribute (nome); } @Override Public Object getValue (nome da string) {return this.session.getValue (nome); } @Override Public Enumeração <String> getAttributenames () {return this.session.getAttributenames (); } @Override public String [] getValuenames () {return this.session.getValuenames (); } @Override public void setAttribute (nome da string, valor do objeto) {this.session.setAttribute (nome, valor); } @Override public void putValue (nome da string, valor do objeto) {this.session.putValue (nome, valor); } @Override public void removeattribute (nome da string) {this.session.removeattribute (nome); } @Override public void RemoneValue (nome da string) {this.session.removeValue (nome); } @Override public void invalidate () {this.session.Invalidate (); } @Override public boolean isnew () {return this.session.isnew (); }}O código acima pode salvar a sessão no redis. Obviamente, existem muitos problemas, como a geração de SessionID, a sessão passada, a serialização do objeto (o teste usa string para conveniência) e muitos outros problemas. Vou melhorá -lo mais tarde se tiver tempo.
Para obter mais informações sobre o conteúdo relacionado a Java, consulte os tópicos deste site: "Java+Resumo da programação do banco de dados MySQL", "Java Operação Excel Skills Resumo", "Estrutura de dados Java e tutorial de algoritmo", "Java Arquivo e operação de diretório Summary Summary e" Java Operação domina as habilidades sumário ""
Espero que este artigo seja útil para a programação Java de todos.