В этой статье описывается простая реализация сессии Java Session, который Redis. Поделитесь этим для вашей ссылки, следующим образом:
При балансировании нагрузки, если пользователь обращается к другой машине и не выполняет синхронизацию сеанса, пользователь будет спросить, что очень плохо для пользовательского опыта, поэтому нам очень необходимо выполнить синхронизацию сеанса. Поместите сеанс на сервер Cache Reids, может хорошо решить проблему. Ниже приводится простая реализация кода.
1. Настройте фильтр web.xml:
<Filter> <Filter-name> SessionFilter </filter-name> <filter-class> org.springframework.web.filter.delegatingfilterproxy </filter-class> </filter> <Filter-MAPPIN
2. Настройте соответствующее имя фильтра:
<bean id = "sessionfilter"> <name = "redistemplate" ref = "redistemplate"/> </bean>
Реализация SessionFilter:
Public Class SessionFilter Extens GenericFilterBean {Private Redistemplate Redistemplate; @Override public void dofilter (запрос ServletRequest, ответ ServletResponse, FilterChain Chain) бросает ioException, ServletException {System.out.println ("Filter"); Httpservletrequest re = (httpservletrequest) запрос; Httpservletresponse res = (httpservletresponse) ответ; Terryhttpservletrequestwrapper warper = new terryhttpservletrequestwrapper (re, res, redistemplate); chain.dofilter (обертка, ответ); } public redistemplate getRedistemplate () {return redistemplate; } public void setredistemplate (Redistemplate Redistemplate) {this.redistemplate = Redistemplate; }}4. Внедрение TerryhttpservletRequestWrapper:
Общедоступный класс TerryhttpservletRequestWrapper Extends httpservlectrequestwrapper {private cachehttpsession session; Частный ответ httpservletresponse; Частный Redistemplate Redistemplate; public terryhttpservletrequestwrapper (httpservletrequest, httpservletresponse, redistemplate redistemplate) {super (запрос); this.redistemplate = ответ; this.redistemplate = redistemplate; } @Override public httpsession getsession (boolean create) {if (session! = Null) {return session; } String sid = "terry" + system.currentTimeMiMillis (); PriseSidtocookie (SID); session = new Cachehttpsession (null, sid, redistemplate); возвратный сеанс; } @Override public httpsession getsession () {return getsession (false); } защищенный void writesIdtocookie (String sid) {cookie mycookies = new cookie ("terry", sid); mycookies.setMaxage (-1); mycookies.setdomain ("locahost"); mycookies.setPath ("/"); response.addcookie (Mycookies); }}5. Реализация Cachehttpsession:
открытый класс cachehttpsession расширяет httpsessionwrapper {private String sid; Частный Redistemplate Redistemplate; Private StringRedisserializer Stringserializer = new StringRedisSerializer (); public cachehttpsession (httpsession session, string sid, redistemplate redistemplate) {super (session); this.sid = sid; this.redistemplate = redistemplate; } @Suppresswarnings ("unchecked") @override public enumeration <string> getattributeNames () {final byte [] key = stringerializer.serialize (sid); Object result = Redistemplate.execute (new Recascallback <object> () {@Override public Object doInredis (Redisconnection Connection) Throws DataCcessException {set <byte []> set = connection.keys (key); return set;}}); if (result! = null) {set <byte []> s = (set <byte []>) result; SET <String> ss = new Hashset <String> (); for (byte [] b: s) {ss.add (stringserializer.deserialize (b)); } Enumeration <string> en = new Vector (ss) .Elements (); вернуть en; } return null; } @Suppresswarnings ("unchecked") @override public void setattribute (string name, значение объекта) {final byte [] key = stringerializer.serialize (name); окончательный байт [] v = stringserializer.serialize (((строка) значение); redistemplate.execute (new resiscallback <object> () {@override public Object doinredis (Redisconnection Connection) Throws DataCcessException {connection.set (key, v); return null;}}); } @Override public Object getAttribute (string name) {final byte [] key = stringserializer.serialize (name); @Suppresswarnings ("unchecked") value = redistemplate.execute (new resiscallback <object> () {@override public объект doinredis (redisconnection connection) бросает DataCcessException {return Connection.get (key);}}); возвращаемое значение; } @Override public String getId () {return sid; }}6. Внедрение HttpsessionWrapper:
открытый класс httpsessionWrapper реализует httpsession {private httpsession session; public httpsessionWrapper (httpsession session) {this.session = session; } @Override public long getCreationTime () {return this.session.getCreationTime (); } @Override public String getId () {return this.session.getid (); } @Override public long getLastAccessationTime () {return this.session.getLastaccestimeTime (); } @Override public servletContext getServletContext () {return this.session.getServletContext (); } @Override public void setMaxInativeInterval (int vidval) {this.session.setMaxIctiveInterval (интервал); } @Override public int getMaxInativeInterval () {return this.session.getMaxInativeInterval (); } @Override public httpsessionContext getSessionContext () {return this.session.getSessionContext (); } @Override public Object getAttribute (string name) {return this.session.getattribute (name); } @Override public Object getValue (string name) {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 (string name, значение объекта) {this.session.setattribute (name, value); } @Override public void putvalue (string name, значение объекта) {this.session.putvalue (name, value); } @Override public void removeAttribute (string name) {this.session.removeattribute (name); } @Override public void removeValue (string name) {this.session.RemoveValue (name); } @Override public void Invalidate () {this.session.invalidate (); } @Override public boolean isnew () {return this.session.isnew (); }}Приведенный выше код может сохранить сеанс в Redis. Конечно, есть много проблем, таких как генерация сеанса, прошедшая сессия, сериализация объекта (тестирование использует строку для удобства) и многие другие проблемы. Я улучшу его позже, если у меня будет время.
Для получения дополнительной информации о контенте, связанном с Java, пожалуйста, ознакомьтесь с темами этого сайта: «Java+MySQL Database Scholarming», «Сводка навыков Java Excel», «Резюме Java Structure Data Structure и Algorithm Tuperial», «Сводка навыков Java File и Directory».
Я надеюсь, что эта статья будет полезна для всех Java Programming.