Implementar gerenciamento de sessão distribuída na primavera
Este artigo implementa principalmente a sessão distribuída na primavera e usa Redis para persistir a sessão. Dessa forma, quando o aplicativo é implantado, não há necessidade de configurar distribuídos em contêineres como resina e tomcat, o que é conveniente para adicionar novos servidores de nó para expansão do cluster. A sessão não depende dos servidores de cada nó e pode ser obtida diretamente da Redis. Aqui está o código central da função:
1. Primeiro configure -o em web.xml
Adicionar ao Interceptor:
<!-Sessão distribuída Iniciar-> <filter> <filtro-name> distributedSessionFilter </filter-name> <filter-Class> distributedSessionFilter </filter-Class> <it-param> <!-Necessário, chave. 2 maneiras, 1 corresponde ao feijão, o formato é o feijão: chave. 2 seqüências, formatos como: affffrfgv-> <am-name> key </amam-name> <amam-value> xxxxxxxxx </param-value> </irit-param> <iit-param> <!-necessário, o feijão correspondente a Redis é BEAN: xx-> <amam-name> cachean <amam-value> Bean: RECREVERSISTENTE </param-value> // distributedBaseInterface, correspondendo a essa interface, execute a operação de persistência da sessão </irit-param> <iit-param> <!-requerir,-> <air-name> Cookiename </param-name> <aparaM> testsessionId </param-value> </param> </param> cookiename </param-name> <amaMalue> TestSessionId </param-value> </param> </param> </param> cookiename </param-name> <apare>> <Filter-Name> distributedSessionFilter </filter-name> <url-tattern>*. do </url-tattern> </filter-mapping> <!-End Sessão distribuída->
2. A implementação do interceptador, o código principal é o seguinte
Existem principalmente as seguintes categorias:
1. DistributedSessionFilter implementa o filtro:
importar java.io.ioException; importar java.util.hashmap; importar java.util.map; importar javax.servlet.filter; importar javax.servlet.filterchain; importexception; javax.servlet.servletResponse; importar javax.servlet.http.httpServletRequest; importar javax.servlet.http.httpServletResponse; importação org.springframework.web.context.webApplicationContext; org.springframework.web.context.support.webApplicationContextUtils; classe pública distributedsessionfilter implementa filtro {private static final logger log = loggerFactory.getLogger (distributedSessionFilter.class); String Private String Cookiename; // É principalmente uma operação para gerenciar a sessão privada distributedSessionManager distributedSessionManager; Chave de string privada;}Método de inicialização quando o contêiner inicia:
@Override public void init (filterConfig config) lança servletexception {webApplicationContext wac = webApplicationContextutils.getRequisedWeBapplicationContext (config .getServletContext ()); String key = config.getInitParameter ("key"); String cookiename = config.getInitParameter ("cookiename"); String cacheBean = config.getInitParameter ("cachebean"); // Obtenha o nome do feijão, a configuração é "Bean:" String redisbeanstr = cachebean.substring (5); DistributedBaseInterface DistributedCache = (DistributedBaseInterface) wac.getBean (RedisBeansTr); // Obtenha a chave, existem 2 métodos de configuração, 1 corresponde ao feijão e o formato é Bean: Key. 2 String if (key.startswith ("bean:")) {this.key = (string) wac.getbean (key.substring (5)); } else {this.key = key; } this.cookiename = cookiename; this.distributedSessionManager = distributedSessionManager.getInstance (distributedCache); // O manuseio de exceção é omitido. . . }Execute a interceptação de solicitação real:
@Override public void Dofilter (servletRequest servletRequest, servletResponse servletResponse, filterhain filterhain) lança servletexception, ioexception {distributehttpServletReQuestWrapper distreq = null; tente {// solicitar processamento de distrato = CreateDistribedRequest (servletRequest, servletResponse); filtrhain.dofilter (distreq, servletResponse); } catch (throwable e) {// omitido. . . } finalmente {if (distreq! = null) {try {// Após o processamento da solicitação, processe a sessão (salvando principalmente a sessão da sessão). } catch (e2 arremessado) {// omitido. . . }}}}} // Solicitação distribuída distribuído privadoHttpServleTReQuestWapper CreatedIrtIcedRequest (servletRequest servletRequest, servletResponse servletResponse) lança iooException, servleTexception {httpSleTreQuest Solicy = (HTTSTEXCECT, HttpServLeTResponse Response = (httpServletResponse) servletResponse; String usersid = cookieutil.getcookie (cookiename, solicitação); String realsid = distributedSessionManager.getActualSid (usuáriosID, solicitação, chave); if (stringutil.isblank (realsid)) {if (stringutil.isnotblank (usersId)) {log.info ("usersid [{}] verificação falha", ususersid); } // grava cookie string [] usersidarr = distributedSessionManager.createUsersid (solicitação, chave); usersId = usuáriosidarr [0]; Cookieutil.SetCookie (Cookiename, UsersId, Solicitação, Resposta); realsid = usersidarr [1]; } realsid = "SID:" + realsid; DistribuedhttpSessionwrapper distsession = null; tente {map <string, object> allattribute = distributedSessionManager.getSession (realsid, request.getSession () .getMaxinActiveInterval ()); DistSession = new DistributedHttpSessionWrapper (realsid, request.getSession (), Allattribute); } catch (throwable e) {// Ocorreu um erro, exclua o log de dados em cache.error (e.getMessage (), e); Mapa <string, objeto> allattribute = new hashmap <string, object> (); DistSession = new DistributedHttpSessionWrapper (realsid, request.getSession (), Allattribute); distributedSessionManager.RemoveSession (distsession); } DistribuídoHttpServLeQuestWrapper requestWrapper = new DistributedHttpServletRequestWrapper (request, distsession); retornar requestWrapper; } // Operação Sessão Private Void OalSessionAfterRequest (distribuídoHttpSessionWrapper Session) {if (session == null) {return; } if (session.changed) {distributedSessionManager.SaveSession (Sessão); } else if (session.invalidado) {distributedSessionManager.RemoveSession (Sessão); } else {distributedSessionManager.expire (sessão); }}2. DistributedSessionManager, lida principalmente com sessões distribuídas, código principal:
classe DistributedSessionManager {Log estático de estático protegido = loggerFactory.getLogger (distributedSessionManager.class); private static distributedSession manager instância = null; // Redis lida com a interface da sessão e implementa o private distribuedBaseInterface DistributedBaseInterface; byte estático privado [] bloqueio = novo byte [1]; private distributedSessionManager (distributedBaseInterface DistributedBaseInterface) {this.distribedBaseInterface = distributedBaseInterface; } public static distribuedSessionManager getInstance (distributedBaseInterface redis) {if (instance == null) {synchronized (Lock) {if (instance == null) {instance = new DistributedSessionManager (redis); }}} retornar a instância; } // obtenha sessão pública mapa <string, object> getSession (string sid, int segundo) {string json = this.distribedBaseInterface.get (sid, segundo); if (stringutil.isnotblank (json)) {return jsonutil.unserializemap (json); } retornar novo hashmap <string, object> (1); } // Salvar sessão public void Savesession (distributedHttpSessionWrapper Session) {map <string, object> map = session.allattribute; if (maputil.isempty (map)) {return; } String json = jsonutil.SerializEMap (map); this.distributedBaseInterface.Set (session.getId (), json, session.getMaxinActiveInterval ()); } // Excluir sessão public void RemoveSession (distributedHttpSessionWrapper Session) {DistributedBaseInterface.del (session.getId ()); } public void expire (distributedhttpSessionWrapper session) {distributedBaseInterface.expire (session.getId (), session.getMaxinActiveInterval ()); } /** * Crie sid do cookie * /public string [] createUsersid (solicitação httpServletRequest, chave de string) {// ...} public string getActualSid (string usersId, httpServletRequest Solicy, chave de string) {// ...}}}}3. DistributedHttpSessionWrapper implementa httpsession e executa embalagem de sessão distribuída, código principal:
classe pública distribuídoHttpSessionWrapper implementa httpssession {orgissession privado httpssession; Private String Sid; booleano alterado = false; booleano invalidado = false; Mapa <string, objeto> Allattribute; public distributedHttpSessionWrapper (String SID, Sessão HttpSession, Map <String, Object> Allattribute) {this.orgisession = session; this.sid = sid; this.allattribute = allattribute; } @Override public String getId () {return this.sid; } @Override public void setAttribute (nome da string, valor do objeto) {alteração = true; allattribute.put (nome, valor); } @Override Public Object getAttribute (nome da string) {return allattribute.get (nome); } @Override Public Enumeração <String> getAttributenames () {set <tring> set = allattribute.keySet (); Iterator <string> iterator = set.iterator (); devolver nova mienUmation <String> (iterator); } mienUmation de classe privada <T> implementa enumeração <T> {iterator <t> iterator; MIENUMERAÇÃO PÚBLICA (ITERATOR <T> iterator) {super (); this.iterator = iterator; } @Override public boolean hasMoreElements () {return iterator.hasnext (); } @Override public t próximolement () {return iterator.Next (); }} @Override public void invalidate () {this.invalidado = true; } @Override public void removeattribute (nome da string) {alteração = true; allattribute.remove (nome); } @Override public Long getCreationTime () {return orgisession.getcreationTime (); } @Override public Long getLastAccedTime () {return orgisession.getLastAccedTime (); } @Override public int getMaxinActiveInterval () {return orgisession.getMaxinActiveInterval (); } @Override public servletContext getServletContext () {return orgisession.getServletContext (); } @Override Public Object getValue (string arg0) {return orgisession.getValue (arg0); } @Override public String [] getValuenames () {return orgisession.getValuenames (); } @Override public boolean isnew () {return orgisession.isnew (); } @Override public void putValue (string arg0, objeto arg1) {orgisession.putValue (arg0, arg1); } @Override public void RemoverValue (String arg0) {orgisession.removeValue (arg0); } @Override public void setMaxinActiveInterval (int arg0) {orgisession.setMaxinActiveInterval (arg0); } @Override public httpSessionContext getSessionContext () {return orgisession.getSessionContext (); }4. DistributedHttpServletRequestWrapper implementa HttpServletRequestWrapper, envolve a sessão processada e a solicitação original, código principal:
classe pública distribuídaHttpServletRequestWrapper estende Javax.servlet.http.httpServletRequestwrapper {private httpServletRequest orgirequest; Sessão privada distribuídaHttpSessionWrapper; public distributedHttpServletRequestWrapper (solicitação httpServLeTrequest, distributedHttpSessionWrapper Session) {super (request); if (session == null) {// Manuseio de exceção. . } if (request == null) {// Manuseio de exceção. . } this.orGirequest = solicitação; this.session = sessão; } public distributedHttpSessionWrapper GetSession (boolean crie) {orgirequest.getSession (Create); sessão de retorno; } public distributedHttpSessionWrapper getSession () {Return Session; }}5. Além disso, defina a interface DistributedBaseInterface para lidar com a sessão em redis para operações de persistência:
interface pública distributedBaseInterface { / ** * Obtenha dados em cache com base na chave * @param key * @param segundos * / public string get (tecla string, int segundos); / ** * Atualize dados em cache * @param key * @param json * @param segundos */ public void set (tecla String, string json, int segundos); / *** exclua cache* @param key*/ public void del (chave da string); / ** * Definir dados expirados * @Param Key * @param segundos */ public void Expire (tecla String, int segundos);Nota: Este artigo usa apenas o método Redis para gerenciar sessões na primavera, e existem muitos outros métodos de implementação, como configuração em contêineres, etc., e projeta um algoritmo de roteamento para fazer sessões dependem de vários servidores de nó no conjunto,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.