Artikel ini menjelaskan implementasi sederhana dari penyelamatan sesi java ke Redis. Bagikan untuk referensi Anda, sebagai berikut:
Dalam penyeimbangan beban, jika pengguna mengakses mesin yang berbeda dan tidak melakukan sinkronisasi sesi, pengguna akan ditanya, yang sangat buruk untuk pengalaman pengguna, sehingga sangat penting bagi kami untuk melakukan sinkronisasi sesi. Letakkan sesi di server Cache Reids dapat menyelesaikan masalah dengan baik. Berikut ini adalah implementasi sederhana dari kode.
1. Konfigurasikan filter 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> <url-pattern>/*</url-pattern></filter-mapping>
2. Konfigurasikan nama filter yang sesuai:
<bean id = "sessionfilter"> <name properti = "redistemplate" ref = "redistemplate"/> </tacer>
Implementasi sessionfilter:
Public Class SessionFilter memperluas genericfilterbean {private redistemplate redistemplate; @Override public void dofilter (permintaan servletRequest, respons servletResponse, rantai filterchain) melempar ioException, servletException {system.out.println ("filter"); Permintaan httpservletRequest re = (httpservletRequest); Respons httpservletResponse res = (httpservletResponse); Terryhttpservletrequestwrapper wrapper = baru terryhttpservletrequestwrapper (RE, res, redistemplate); rantai.dofilter (pembungkus, respons); } public redistemplate getredistemplate () {return redistemplate; } public void setredistemplate (redistemplate redistemplate) {this.redistemplate = redistemplate; }}4. Implementasi TerryhttpservletRequestWrapper:
kelas publik TerryHttpServletRequestWrapper memperluas httpservletRequestWrapper {private CacheHTtpsession Session; respons httpservletResponse pribadi; redistemplate pribadi redistemplate; TerryHttpServletRequestWrapper publik (permintaan httpservletRequest, respons httpservletResponse, redistemplate redistemplate) {super (permintaan); this.redistemplate = respons; this.redistemplate = redistemplate; } @Override public httpsession getSession (boolean create) {if (session! = Null) {return sesi; } String sid = "terry" + system.currentTimeMillis (); writesidtocookie (Sid); session = CacheHttpsession baru (NULL, SID, REDISTEMPLATE); sesi kembali; } @Override public httpsession getSession () {return getSession (false); } protected void writesIdtocookie (string sid) {cookie mycookies = cookie baru ("terry", sid); mycookies.setmaxage (-1); mycookies.setDomain ("locahost"); mycookies.setpath ("/"); response.addcookie (mycookies); }}5. Implementasi CACHEHTTPSESSION:
CacheHttpsession kelas publik memperluas httpsessionwrapper {private string sid; redistemplate pribadi redistemplate; Private StringRedisSerializer stringSerializer = new StringRedisSerializer (); CacheHttpsession publik (sesi httpsession, string sid, redistemplate redistemplate) {super (sesi); this.sid = sid; this.redistemplate = redistemplate; } @SuppressWarnings ("Uncecked") @Override Public Enumeration <String> getAttributeNames () {final byte [] key = stringSerializer.serialize (sid); Hasil Objek = Redistemplate.Execute (REDISCALLBACK BARU <Object> () {@Override Objek publik DoInredis (Redisconnection Connection) melempar DataAccessException {set <byte []> set = connection.keys (key); return set;}}); if (result! = null) {set <byte []> s = (set <byte []>) hasil; Set <string> ss = hashset baru <string> (); untuk (byte [] b: s) {ss.add (stringserializer.deserialize (b)); } Enumeration <string> en = vektor baru (ss) .elements (); mengembalikan en; } return null; } @SuppressWarnings ("Uncecked") @Override public void setAttribute (nama string, nilai objek) {byte akhir [] key = stringserializer.serialize (name); byte akhir [] v = stringSerializer.serialize ((string) nilai); redistemplate.execute (REDISCALLBACK baru <POBPENT> () {@Override Objek publik DoInredis (Redisconnection Connection) melempar DataAccessException {connection.set (key, v); return null;}}); } @Override Objek publik getAttribute (nama string) {final byte [] key = stringserializer.serialize (name); @SuppressWarnings ("Uncecked") Nilai Objek = Redistemplate.Execute (Rediscallback baru <POBPENT> () {@Override Objek publik DoinRedis (Redisconnection Connection) melempar DataAccessException {return connection.get (key);}}); nilai pengembalian; } @Override Public String getId () {return sid; }}6. Implementasi httpsessionwrapper:
kelas publik httpsessionWrapper mengimplementasikan httpsession {private httpsession sesi; httpsessionwrapper publik (sesi httpsession) {this.Session = sesi; } @Override public long getCreationTime () {return this.Session.getCreationTime (); } @Override public string getId () {return this.Session.getId (); } @Override public long getLastAccessedTime () {return this.Session.getLastAccessedtime (); } @Override public servletContext getServletContext () {return this.Session.getSerVletContext (); } @Override public void setmaxInactiveInterval (int interval) {this.Session.setMaxInactiveInterval (interval); } @Override public int getMaxInactiveInterval () {return this.Session.getmaxInactiveInterVal (); } @Override public httpsessionContext getSessionContext () {return this.Session.getSessionContext (); } @Override objek publik getAttribute (nama string) {return this.Session.getAttribute (name); } @Override Objek publik getValue (nama string) {return this.Session.getValue (name); } @Override Public Enumeration <String> getAttributeNames () {return this.Session.getAttributeNames (); } @Override public string [] getValueNames () {return this.Session.getValueNames (); } @Override public void setAttribute (nama string, nilai objek) {this.Session.setAttribute (name, value); } @Override public void putvalue (nama string, nilai objek) {this.Session.putValue (name, value); } @Override public void removeAttribute (nama string) {this.session.removeattribute (name); } @Override public void removEvalue (nama string) {this.session.removevalue (name); } @Override public void Invalidate () {this.session.invalidate (); } @Override public boolean isNew () {return this.session.isnew (); }}Kode di atas dapat menyimpan sesi ke Redis. Tentu saja, ada banyak masalah, seperti generasi sessionID, sesi masa lalu, serialisasi objek (pengujian menggunakan string untuk kenyamanan), dan banyak masalah lainnya. Saya akan memperbaikinya nanti jika saya punya waktu.
Untuk informasi lebih lanjut tentang konten terkait Java, silakan lihat topik -topik situs ini: "Java+MySQL Ringkasan Pemrograman Database", "Java Operation Excel Skills Ringkasan", "Struktur Data Java dan Tutorial Algoritma", "Java File dan Ringkasan Keterampilan Operasi Java" dan "Java Operation Skills Ringkasan" Java Operation Skills Ringkasan "Java Ringkasan" Java Operation Skills Ringkasan "Ringkasan Node Node Node Ringkasan"
Saya harap artikel ini akan membantu pemrograman Java semua orang.