Menerapkan manajemen sesi terdistribusi di musim semi
Artikel ini terutama mengimplementasikan sesi terdistribusi di musim semi, dan menggunakan Redis untuk bertahan sesi. Dengan cara ini, ketika aplikasi digunakan, tidak perlu mengkonfigurasi terdistribusi dalam wadah seperti resin dan tomcat, yang nyaman untuk menambahkan server node baru untuk ekspansi cluster. Sesi ini tidak tergantung pada server dari setiap node dan dapat diperoleh langsung dari REDIS. Berikut adalah kode inti fungsi:
1. Pertama mengonfigurasinya di web.xml
Tambahkan ke Interceptor:
<!-Sesi Terdistribusi Mulai-> <nilter> <filter-name> DistributedSessionFilter </tilter-name> <STERNTER-CLASS> DistributedSessionFilter </filter-class> <Ilin-param> <!-Diperlukan, Key. 2 cara, 1 sesuai dengan kacang, format adalah kacang: kunci. 2 string, format seperti: affffrfgv-> <param-name> Kunci </param-name> <param-value> xxxxxxxx </param-value> </it-param> <Ilin-param> <!-Diperlukan, kacang yang sesuai dengan redis adalah bean: xx-> <param-name> cachean </n-name> cachean </n-name> cachean </n-name </cachean </cachean </n-name> cachean </cachean </cachean </cachean </no-ne-ne-ne3 <param-value> bean: redispersistent </param-value> // distributedbaseinterface, sesuai dengan antarmuka ini, lakukan operasi persistence sesi </init-param> <Ilin-param> <!-Diperlukan,-<param-name> cookiename </param-name> <param-value> TestSessiesid </Param-Param> </param-name> <param-value> TestSessiesId </Param-Param- Cookiename </param-name> <param-value> testsessiesid </Param-Param- Cookiename </param-name> <param-value> <param-param> </Parnam> <param-value> testsessiesID </Param-Param- Cookeename </Param-name> <param-value> <filter-name> DistributedSessionFilter </filter-name> <RURL-PATERS>*. Lakukan </RURL-PATERS> </TERFERTER-MAPPING> <!-Sesi Terdistribusi Akhir->
2. Implementasi pencegat, kode inti adalah sebagai berikut
Terutama ada kategori berikut:
1. DistributedSessionFilter mengimplementasikan filter:
Impor java.io.ioException; impor java.util.hashmap; impor java.util.map; impor javax.servlet.filter; javax.servlet.filterchain; impor javax.servlet.filterconfig; impor javax.servlet.servlexcepted; javax.servlet.servletresponse; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletResponse; impor org.springframework.web.context.webapplicationcontext; org.springframework.web.context.support.webApplicationContextUtils; kelas publik DistributedSessionFilter mengimplementasikan filter {private static final logger = loggerFactory.getLogger (didistribusikancessionfilter.class); Private String Cookiename; // Ini terutama operasi untuk mengelola sesi distribusi swasta yang didistribusikan oleh RessiessiesManager; tombol string pribadi;}Metode inisialisasi saat wadah dimulai:
@Override public void init (filterconfig config) melempar servletException {WebApplicationContext wac = webappleCicleContextutils.getRequiredWebApplicationContext (config .getSerVletContext ()); String key = config.getInitparameter ("key"); String cookiename = config.getInitparameter ("cookiename"); String CacheBean = config.getInitparameter ("CacheBean"); // Dapatkan nama kacang, konfigurasinya adalah "kacang:" string redisbeimb = cacheBean.substring (5); DistributedBaseInterface DistributedCache = (DistributedBaseInterface) wac.getbean (RedisBeAcstr); // Dapatkan kunci, ada 2 metode konfigurasi, 1 sesuai dengan kacang, dan formatnya adalah kacang: kunci. 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); // Penanganan pengecualian dihilangkan. . . }Lakukan intersepsi permintaan aktual:
@Override public void dofilter (servletRequest servletRequest, servletResponse servletResponse, filterchain filterchain) melempar servletException, ioException {distributedHttpservletRequestWrapper distreq = null; coba {// minta pemrosesan distreq = createTistributedRequest (servletRequest, servletResponse); filterchain.dofilter (distreq, servletResponse); } catch (Throwable e) {// dihilangkan. . . } akhirnya {if (distreq! = null) {coba {// Setelah memproses permintaan, proses sesi (terutama menyimpan sesi sesi) dealSessionAfterRequest (distreq.getSession ()); } catch (Throwable e2) {// dihilangkan. . . }}}}} // permintaan terdistribusi pribadi distribusi httpservletrequestwrapper dibuat distribusiRequest (servletRequest servletRequest, servletResponse responsponse) lemparan ioException, servletlexception {httpservletRequest) request = (htttpservexception {httpservleteDrequest) permintaan = (htttpspservexception {httpservleteDreqest = (htttpspservexception {httpservleteDreqest = (htttpspservexception {httpservleter HttpservletResponse respons = (httpservletResponse) ServletResponse; String UsersId = cookieutil.getCookie (cookiename, permintaan); String AcctiveSid = DistributedSessionManager.getActualSid (UsersID, Request, Key); if (stringutil.isBlank (actactionsid)) {if (stringutil.isnotblank (usersId)) {log.info ("UsersId [{}] verifikasi gagal", UsersId); } // Tulis cookie string [] UsersIdarr = distributeSessionManager.CreateUsersId (request, key); UsersId = Usersidarr [0]; Cookieutil.setcookie (cookiename, userid, permintaan, respons); AcctualSID = Usersidarr [1]; } AcctiveSid = "SID:" + ActiveSid; DistributedHttpSessionWrapper Distession = null; Coba {MAP <String, Object> AllAttribute = DistributedSessionManager.getSession (AcctiveSid, Request.GetSession () .GetMaxInactiveInterVal ()); DistSession = New DistributedHttpsessionWrapper (AcctiveSid, Request.getSession (), AllAttribute); } catch (Throwable e) {// Terjadi kesalahan, hapus log.Error data yang di -cache (e.getMessage (), e); Peta <String, Object> allAttribute = HashMap baru <String, Object> (); DistSession = New DistributedHttpsessionWrapper (AcctiveSid, Request.getSession (), AllAttribute); DistributedSessionManager.Removesession (Distession); } DistributedHttpservletRequestWrapper requestwrapper = baru distribusiHttpservletRequestWrapper (permintaan, dispsision); return requestwrapper; } // Sesi Operasi Private Void DealSessionAfterRequest (distributedHttpsessionWrapper sesi) {if (session == null) {return; } if (session.changed) {distributedSessionManager.savesession (session); } lain jika (session.invalidasi) {distributeSessionManager.removesession (session); } else {distributedSessionManager.Expire (sesi); }}2. DistributedSessionManager, terutama berurusan dengan sesi terdistribusi, kode inti:
kelas didistribusikan, manager {static static final logger log = loggerFactory.getLogger (distributedSessionManager.class); Private Static DistributedSessionManager Instance = null; // Redis menangani antarmuka sesi dan mengimplementasikan Private DistributedBaseinterface DistributedBaseinterface; byte statis pribadi [] lock = byte baru [1]; Private DistributedSessionManager (DistributedBaseInterface DistributedBaseinterFace) {this.DistributedBaseinterFace = DistributedBaseinterFace; } public static DistributedSessionManager getInstance (distributedBaseinterface redis) {if (instance == null) {disinkronkan (lock) {if (instance == null) {instance = new distributeSessionManager (redis); }}} return instance; } // Dapatkan sesi peta publik <string, objek> getSession (string sid, int kedua) {string json = this.distributedBaseinterface.get (sid, kedua); if (stringutil.isnotblank (json)) {return jsonutil.unserializemap (json); } return baru hashMap <string, objek> (1); } // Simpan sesi public void savesession (distributedHttpsessionWrapper sesi) {peta <string, object> peta = session.allattribute; if (maputil.isempty (peta)) {return; } String json = jsonutil.serializemap (peta); this.distributedBaseinterface.set (session.getId (), json, session.getmaxInactiveInterval ()); } // hapus sesi public void hapus (distributedHttpSessionWrapper sesi) {distributedBaseinterface.del (session.getId ()); } public void kedaluwarsa (distributedHttpSessionWrapper sesi) {distributedBaseinterface.expire (session.getId (), session.getmaxInactiveInterval ()); } /** * Buat sid dari cookie * /public string [] createUsersId (permintaan httpservletrequest, tombol string) {// ...} public string getActualSid (String UsersID, permintaan httpservletRequest, tombol string) {// ...}}3. DistributedHttpsessionWrapper mengimplementasikan httpsession dan melakukan kemasan sesi terdistribusi, kode inti:
kelas publik distributedHttpsessionWrapper mengimplementasikan httpsession {private httpsession orgisession; sid string pribadi; Boolean berubah = false; boolean tidak validasi = false; Peta <String, Object> AllAttribute; Public DistributedHttpSessionWrapper (String Sid, Httpsession Session, Map <String, Object> AllAttribute) {this.orgisession = sesi; this.sid = sid; this.allattribute = allAttribute; } @Override public string getId () {return this.sid; } @Override public void setAttribute (nama string, nilai objek) {ubah = true; allattribute.put (nama, nilai); } @Override objek publik getAttribute (nama string) {return allAttribute.get (name); } @Override Public Enumeration <string> getAttributeNames () {set <string> set = allAttribute.keyset (); Iterator <string> iterator = set.iterator (); mengembalikan myenumeration baru <string> (iterator); } kelas pribadi myenumeration <T> mengimplementasikan enumerasi <T> {iterator <T> iterator; myenumeration publik (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.invalideded = true; } @Override public void removeAttribute (nama string) {ganti = true; allattribute.remove (name); } @Override public long getCreationTime () {return orgisession.getCreationTime (); } @Override public long getLastAccessedTime () {return orgisession.getLastAccessedtime (); } @Override public int getMaxInactiveInval () {return orgisession.getmaxInactiveInterval (); } @Override public servletContext getServletContext () {return orgisession.getSerVletContext (); } @Override objek publik 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, objek arg1) {orgisession.putValue (arg0, arg1); } @Override public void removEvalue (String arg0) {orgisession.removevalue (arg0); } @Override public void setmaxInactiveInterval (int arg0) {orgisession.setMaxInactiveInterval (arg0); } @Override public httpsessionContext getSessionContext () {return orgisession.getSessionContext (); }4. DistributedHttpServletRequestWrapper mengimplementasikan httpservletrequestwrapper, membungkus sesi yang diproses dan permintaan asli, kode inti:
Kelas Publik DistributedHttpServletRequestWrapper memperluas javax.servlet.http.httpservletRequestWrapper {private httpservletRequest orgirequest; Sesi Private DistributedHttpsessionWrapper; DistributedHttpServletRequestWrapper publik (permintaan httpservletRequest, distributedhttpsessionwrapper sesi) {super (permintaan); if (session == null) {// penanganan pengecualian. . } if (request == null) {// penanganan pengecualian. . } this.orgirequest = request; this.Session = sesi; } public distributedHttpSessionWrapper getSession (boolean create) {orgirequest.getSession (create); sesi kembali; } public distributedHttpSessionWrapper getSession () {return sesi; }}5. Selain itu, tentukan antarmuka DistributedBaseinterface untuk menangani sesi ke Redis untuk operasi kegigihan:
antarmuka publik distribusiBaseInterface { / ** * Dapatkan data yang di -cache berdasarkan tombol * @param key * @param detik * / string publik get (tombol string, int detik); / ** * Perbarui data yang di -cache * Kunci @param * @param json * @param detik */ set public void (tombol string, string json, int detik); / *** Hapus cache* @param Key*/ public void del (tombol string); / ** * Atur data yang kedaluwarsa * Kunci @param * @param detik */ public void kedaluwarsa (tombol string, int detik);Catatan: Artikel ini hanya menggunakan metode Redis untuk mengelola sesi di musim semi, dan ada banyak metode implementasi lainnya, seperti konfigurasi dalam wadah, dll., Dan merancang algoritma routing untuk membuat sesi mengandalkan berbagai server node di dalam Cluster ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0 Leitegegugemug Pre,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,OnY,,,,,,,,,,,,,,,,,,,,,,,,,,esasan,,,,,,,,,,,,,,,,,,,,,esasan,,,,,,,,,,,,,,,,,,,esasan,,,,,,,,,,,,,,,,,,esasan,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,OnY,,,,,,,,,,,,,,,,,,,,,,,,,,esasan,,,,,,,,,,,,,,,,,,,,,esasan,,,,,,,,,,,,,,,,,,,esasan,,,,,,,,,,,,,,,,,,esasan,,,,,,,,,,,
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.