Implementieren Sie das verteilte Sitzungsmanagement im Frühjahr
Dieser Artikel implementiert hauptsächlich eine verteilte Sitzung im Frühjahr und verwendet wieder die Sitzung, um die Sitzung zu bestehen. Auf diese Weise müssen bei der Bereitstellung der Anwendung keine Verteilungen in Containern wie Harz und Tomcat konfiguriert werden, was zum Hinzufügen neuer Knotenserver für die Clustererweiterung geeignet ist. Die Sitzung hängt nicht von den Servern jedes Knotens ab und kann direkt von Redis erhalten werden. Hier ist der Kerncode der Funktion:
1. Konfigurieren Sie es zuerst in web.xml
Hinzufügen zu Interceptor:
<!-Distributed Session Start-> <Filter> <Filter-Name> DistributeSessionFilter </Filter-Name> <Filter-Class> DistributeSessionFilter </Filter-Class> <init-param> <!-Erforderlich, Schlüssel. 2 Wege, 1 entspricht Bean, Format ist Bean: Schlüssel. 2 Saiten, Formate wie: AFFFFRFGV-> <PARAM-NAME> Schlüssel </param-name> <param-value> xxxxxxxx </param-value> </init-param> <init-param> <! <param-value>bean:redisPersistent</param-value>//DistributedBaseInterFace, corresponding to this interface, perform session persistence operation</init-param> <init-param> <!-- Required, --> <param-name>cookieName</param-name> <param-value>TESTSESSIONID</param-value> </init-param> </filter> <filter-mapping> <Filter-name> DistributeSessionFilter </filter-name> <URL-Muster>*. Do </url-pattern> </filter-mapping> <!-Verteilte Sitzungsende->
2. Die Implementierung des Interceptors ist der Kerncode wie folgt
Es gibt hauptsächlich die folgenden Kategorien:
1.. DistributeSessionFilter implementiert Filter:
Java.io.ioException importieren; import Java.util.hashMap; import Java.util.map; import Javax.servlet.Filter; import Javax.servlet.filterchain; importieren javax.servlet.Filterconfig; javax.servlet.servletResponse; import javax.servlet.http.httpServletRequest; import javax.servlet.http.httpserdRetRePon; org.springFramework.web.context.support.WebApplicationContextutils; öffentliche Klasse DistributeSessionFilter implementiert filter {private statische logger logger log = loggerFactory.getLogger (DistributeSessionFilter.class); private String Cookiename; // Es ist hauptsächlich eine Operation, die Sitzung privat DistributeSessionManager DistriTeSessionManager zu verwalten. privater String -Schlüssel;}Initialisierungsmethode, wenn der Container beginnt:
@Override public void init (filterConfig config) löscht servleTexception {WebApplicationContext wac = webapplicationContextils.getRequiredWebApplicationContext (config .GetServletContext ()); String key = config.GetInitParameter ("Key"); String cookiename = config.getInitParameter ("Cookiename"); String cacheBean = config.getInitParameter ("cacheBean"); // Erhalten Sie den Namen der Bean, die Konfiguration lautet "Bean:" String redisbeanstr = cacheBean.substring (5); DistributedBaseInterface DistributedCache = (DistributedBaseInterface) wac.getbean (redisbeanstr); // Erhalten Sie den Schlüssel, es gibt 2 Konfigurationsmethoden, 1 entspricht Bean und das Format ist Bean: Schlüssel. 2 String if (key.startsWith ("bean:")) {this.key = (string) wac.getbean (key.substring (5)); } else {this.key = key; } this.cookiename = Cookiename; this.destributedSessionManager = DistributeSessionManager.getInstance (DistributedCache); // Ausnahmebehandlung wird weggelassen. . . }Führen Sie die tatsächliche Anfrage nach Abfangen durch:
@Override public void dofilter (servletRequest servletRequest, servletResponse servletresponse, filterchain filterchain) löst servletException, ioException {verteiltehttpServletRequestWrapper destreeq = null aus; Versuchen Sie {// Anfrage verarbeiten destreeq = createdStributedRequest (servletRequest, servletResponse); filterchain.dofilter (destreeq, servletresponse); } catch (throwable e) {// weggelassen. . . } endlich {if (distreeq! } catch (Throwable E2) {// weggelassen. . . }}}}} // Distributed Request Private DistributedHttpServletRequestWrapper CreateDSecributedRequest (servletRequest servletRequest, ServletResponse ServletResponse) löscht IOException, ServletException {httpServletRequest -Anfrage = (httpervletrequest) servletException; HttpServletResponse response = (httpServletResponse) servletResponse; String usersid = cookieUtil.getCookie (Cookiename, Anfrage); String ecalSID = DistributeSessionManager.GetActualSID (BenutzerID, Anfrage, Schlüssel); if (stringutil.isblank (tatsächliche)) {if (stringutil.isnotblank (userId)) {log.info ("usersid [{}] Verifizierung fehlschlägt", userID); } // cookie string [] usersidarr = DistributeSessionManager.Createusersid (Anfrage, Schlüssel); usersid = usersidarr [0]; CookiEutil.setcookie (Cookiename, Benutzerside, Anfrage, Antwort); tructsid = usersidarr [1]; } echtung = "SID:" + tatsalSID; VerteilthttpSessionWrapper destSession = null; try {map <string, Object> Allattribute = DistributeSessionManager.GetSession (aktuell, request.getSession () .GetMaxinActiveInterval ()); DistSession = new DistributedHttpSessionWrapper (tatsächliche, request.getSession (), Allattribute); } catch (throwable e) {// Es ist ein Fehler aufgetreten. Karte <string, Objekt> Allattribute = new HashMap <String, Object> (); DistSession = new DistributedHttpSessionWrapper (tatsächliche, request.getSession (), Allattribute); DistributeSessionManager.RemoveSession (Distsession); } DistributedHttpServletRequestWrapper RequestWrapper = new DistributedHttpServletRequestWrapper (Request, Distsession); Rückgabeanforderungswrapper; } // Betriebssitzung private void DealSessionAfRequest (DistributedHttpSessionWrapper Session) {if (session == null) {return; } if (Session.Changed) {DistributeSessionManager.SaveSession (Sitzung); } else if (Session.inValidated) {DistributeSessionManager.RemoveSession (Sitzung); } else {DistributeSessionManager.Expire (Sitzung); }}2. DistributeSessionManager befasst sich hauptsächlich mit verteilten Sitzungen, Kerncode:
Klasse DistributeSessionManager {Protected Static Final Logger log = loggerFactory.getLogger (DistributeSessionManager.Class); private static verteilteSessionManager Instance = null; // Redis übernimmt die Sitzungsschnittstelle und implementiert private verteilte BaseInterface DistributedBaseInterface; privates statisches Byte [] lock = neues Byte [1]; private DirtesionSessionManager (DistributedBaseInterface DistributedBaseInterface) {this.distributedBaseInterface = DistributedBaseInterface; } public static DistributeSessionManager getInstance (DistributedBaseInterface redis) {if (instance == null) {synchronized (lock) {if (instance == null) {instance = new DistributeSessionManager (redis); }}} return Instance; } // Session public map <String, Object> getSession (String Sid, int Second) {String json = this.distributedBaseInterface.get (SID, Second); if (Stringutil.isnotblank (JSON)) {return jsonUtil.unSerializemap (JSON); } Neue Hashmap <String, Object> (1); } // Sitzung öffentliche void saveSession (DistributedHttpSessionWrapper Sitzung) {MAP <String, Object> map = session.allAttribute; if (maputil.isempty (map)) {return; } String json = jsonUtil.Serializemap (MAP); this.distributedBaseInterface.set (session.getId (), json, session.getMaxinActiveInterval ()); } // Sitzung public void removesion (verteilteHttpSessionWrapper Sitzung) {DistributedBaseInterface.del (Session.getID ()); } public void Ablauf (DistributedHttpSessionWrapper Session) {DistributedBaseInterface.expire (session.getId (), session.getMaxinActiveInterval ()); } /** * SID des Cookies erstellen * /public String [] createSersid (httpServletRequest -Anforderung, String -Schlüssel) {// ...} public String getActualsid (String userID, httpServletRequest, String -Taste) {// ...}}}3.. DistributedhttpSessionWrapper implementiert httpSession und führt verteilte Sitzungsverpackungen aus, Kerncode:
öffentliche Klasse DistributedHttpSessionWrapper implementiert httpSession {private httpSession Orgision; private String Sid; boolean geändert = falsch; boolean ungültig = falsch; Karte <String, Object> Allattribute; public verteiltehttpSessionWrapper (String SID, httpSession Session, MAP <String, Object> Allattribute) {this.orgiSession = Session; this.sid = sid; this.allattribute = Allattribute; } @Override public String getId () {return this.sid; } @Override public void setAttribute (String -Name, Objektwert) {geändert = true; Allattribute.put (Name, Wert); } @Override public Object getAtTribute (String -Name) {return Allattribute.get (Name); } @Override public Enumeration <string> getAtTributenames () {set <string> set = Allattribute.keyset (); Iterator <string> iterator = set.iterator (); Rückgabe neuer Myenumeration <String> (Iterator); } private Klasse MyEnumeration <T> implementiert Enumeration <T> {Iterator <T> Iterator; public myenumeration (iterator <t> iterator) {super (); this.iterator = iterator; } @Override public boolean hasMoreElements () {return iterator.hasnext (); } @Override public t NextElement () {return iterator.next (); }} @Override public void Invalidate () {this.inValidated = true; } @Override public void removeAttribute (String -Name) {geändert = true; Allattribute.Remove (Name); } @Override public Long getCreationTime () {return orgision.getCreationTime (); } @Override public Long getLastAccessTime () {return orgision.getLastAccessTime (); } @Override public int getMaxinActiveInterval () {return orgision.getMaxinactiveInterVal (); } @Override public ServletContext getServletContext () {return orgision.getServletContext (); } @Override öffentliches Objekt getValue (string arg0) {return orgision.getValue (arg0); } @Override public String [] getValuenames () {return orgision.getValuenames (); } @Override public boolean isNew () {return orgision.isNew (); } @Override public void putValue (String arg0, Objekt arg1) {orgision.putValue (arg0, arg0); } @Override public void removeValue (string arg0) {orgision.removeValue (arg0); } @Override public void setMaxinActiveInterval (int arg0) {orgision.setMaxinActiveInterval (arg0); } @Override public httpSessionContext GetSessionContext () {return orgision.getSessionContext (); }V.
öffentliche Klasse DistributedHttpServletRequestWrapper erweitert javax.servlet.http.httpServletRequestWrapper {private httpServletRequest orgirequest; private verteilte httpSessionSwrapper Sitzung; public DistributedHttpServletRequestWrapper (HttpServletRequest -Anfrage, DistributedHttpSessionWrapper Session) {Super (Request); if (session == null) {// Ausnahmebehandlung. . } if (request == null) {// Ausnahmebehandlung. . } this.orgirequest = Anfrage; this.Session = Sitzung; } public DistributedHttpSessionWrapper getSession (boolean create) {orgirequest.getSession (create); Rückgabesitzung; } public DistributedHttpSessionWrapper getSession () {return session; }}5. Definieren Sie außerdem die Schnittstelle für verteilte BaseInterface, um die Sitzung in REDIS für Persistenzvorgänge zu verarbeiten:
öffentliche Schnittstelle DistributedBaseInterface { / ** * REGED -Daten basierend auf dem Schlüssel * @param Key * @param Sekunden * / public String get (String -Schlüssel, int Sekunden); / ** * Aktualisieren Sie zwischengespeicherte Daten * @param key * @param json * @param Sekunden */ public void set (String -Taste, String JSON, int Sekunden); / *** Cache löschen* @param key*/ public void del (String -Schlüssel); / ** * Setzen Sie abgelaufene Daten * @param key * @param Seconds */ public void verfallen (String -Schlüssel, int Sekunden);Hinweis: Dieser Artikel verwendet nur die Redis -Methode, um Sitzungen im Frühjahr zu verwalten, und es gibt viele andere Implementierungsmethoden, wie z. cluster ,,,,,,,,,, , ,,,, , ,,,, , ,,,,
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.