Реализовать распределенное управление сеансами весной
Эта статья в основном реализует распределенную сеанс весной и использует Redis, чтобы сохранить сессию. Таким образом, когда приложение развернуто, нет необходимости настраивать распределенные в контейнерах, таких как смола и Tomcat, что удобно для добавления новых серверов узлов для расширения кластера. Сеанс не зависит от серверов каждого узла и может быть получен непосредственно из Redis. Вот основной код функции:
1. Сначала настройте его в web.xml
Добавить в перехватчик:
<!-Распределенное начало сеанса-> <FiLTER> <Filter-Name> DistributedSessionFilter </filter-name> <filter-class> DistributedSessionFilter </filter-class> <init-param> <!-Требуется, ключ. 2 способа, 1 соответствует бобам, формат - Bean: Key. 2 строки, форматы, такие как: affffrfgv-> <param-name> key </param-name> <param-value> xxxxxxxxx </param-value> </init-param> <init-param> <!-Требуется, фасоль, соответствующий Redis, является Bean: xx-> <param-name> cachebean </param-name> <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> DistributedSessionFilter </filter-name> <url-pattern>*. Do </url-pattern> </filter-mapping> <!-Распределенный конец сеанса->
2. Реализация перехватчика, код основного
Есть в основном следующие категории:
1. Распределенная серияфильтер реализует фильтр:
Импорт java.io.ioexception; импорт java.util.hashmap; import java.util.map; импорт javax.servlet.filter; import javax.servlet.filterchain; импорт javax.servlet.serservig; import javax.servlet.servletexception. javax.servlet.servletresponse; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; импорт org.springframework.web.context.webpplicationcontext; импорт org.springframework.web.context.webapplicationContext; импорт org.springframework.web.context.webapplicationcontext; org.springframework.web.context.support.WebApplicationContextUtils; открытый класс DistributedSessionFilter реализует фильтр {частный статический окончательный логический журнал = loggerFactory.getLogger (DivibutedSessionFilter.class); Приватная строка Cookiename; // это в основном операция по управлению сеансом частным распределением Manager DistributedSessionManager; приватная строковая ключа;}Метод инициализации при запуске контейнера:
@Override public void init (FilterConfig Config) Throws ServletException {webApplicationContext wac = webApplicationContextUtils.getRequiredWebApplicationContext (config .getServletContext ()); String key = config.getinitParameter ("key"); String cookiename = config.getinitParameter ("cookiEname"); String cachebean = config.getinitParameter ("cachebean"); // Получить имя боба, конфигурация - «Бин:» String Redisbeanstr = cachebean.substring (5); DistributedBaseInterface DistributedCache = (DistributedBaseInterface) wac.getbean (Redisbeanstr); // Получить ключ, есть 2 метода конфигурации, 1 соответствует бобам, а формат - 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); // Обработка исключений опущена. Полем Полем }Выполните фактический перехват запроса:
@Override public void dofilter (ServletRequest ServletRequest, ServletResponse Servletresponse, FilterChain FilterChain) Throws ServletException, ioException {DiviTibleDhttpServletRequestWrapper disteq = null; try {// Запрос обработки disteq = createistributeDrequest (servletRequest, servletresponse); FilterChain.dofilter (Distreq, Servletresponse); } catch (Throwable e) {// опущено. Полем Полем } Наконец {if (distreq! = null) {try {// После обработки запроса обработайте сеанс (в основном сохранение сеанса сеанса) DealsSessionAfterRequest (distreq.getSession ()); } catch (бросаемый e2) {// опущен. Полем Полем }}}}} // Распределенный запрос private DistributedHttpserVletRequestWrapper CreateistributeDrequest (ServletRequest ServletRequest, ServletResponse servletresponse) Thripsection, ServletException {httpservlectrequest request = (httpserveerquest) servletexception; Httpservletresponse response = (httpservletresponse) Servletresponse; String usersId = cookieutil.getCookie (cookiename, запрос); String actualSid = DistributedSessionManager.getActualSID (usersId, запрос, ключ); if (stringUtil.isblank (actualSid)) {if (stringUtil.isnotblank (usersId)) {log.info ("usersId [{}] verification не удастся", usersId); } // Написать строку cookie [] usersIdarr = DistributedSessionManager.createUsersId (запрос, ключ); usersId = usersIdarr [0]; Cookieutil.setcookie (cookiename, usersid, запрос, ответ); factionsid = usersidarr [1]; } actainsId = "sid:" + actualSid; DistributedHttpsessionWrapper distsession = null; try {map <string, object> allattribute = DiviubtSessionManager.getSession (factionSid, request.getSession () .getMaxInativeInterVal ()); distsession = new DistributedHttpsessionWrapper (ActualSid, request.getSession (), allattribute); } catch (throwable e) {// произошла ошибка, удалите кэшированный log.error (e.getMessage (), e); Map <string, object> allattribute = new hashmap <string, object> (); distsession = new DistributedHttpsessionWrapper (ActualSid, request.getSession (), allattribute); DistributedSessionManager.RemoveSession (Distsession); } DistributeDhttpserVletRequestWrapper requestWrapper = new DistributedHttpserVletRequestWrapper (запрос, Distsession); return requestWrapper; } // Операция сеанса private void dealsessionAfterRequest (DiviubtedHttpsessionWrapper Session) {if (session == null) {return; } if (session.changed) {DiviubtSessionManager.savesession (session); } else if (session.invalidated) {distributedSessionManager.removesession (session); } else {DistributedSessionManager.expire (Session); }}2. DistributedSessionManager, в основном занимается распределенными сеансами, основной код:
Class DistributedSessionManager {защищенный статический окончательный журнал log = loggerFactory.getLogger (DiviubtSessionManager.class); Частный статический распределенный экземпляр Manager = null; // Redis обрабатывает интерфейс сеанса и реализует Private DistributedBaseInterface DistributedBaseInterface; частный статический байт [] lock = new Byte [1]; Private DistributedSessionManager (DistributedBaseInterface DistributedBaseInterface) {this.DistributedBaseInterface = DistributedBaseInterface; } public static DistributedSessionManager getInstance (DistributedBaseInterface Redis) {if (ancess == null) {synchronized (lock) {if (exant == null) {exants = new DistributedSessionManager (redis); }}} return Encement; } // Получить сеанс публичной карты <string, object> getSession (string sid, int second) {string json = this.distributedBaseInterface.get (sid, второе); if (stringutil.isnotblank (json)) {return jsonutil.unserializemap (json); } вернуть новый HashMap <String, Object> (1); } // Сохранить сеанс public void savesession (DivitwedHttpsessionWrapper Session) {map <string, object> map = session.allattribute; if (maputil.isempty (map)) {return; } String json = jsonutil.serializeMap (map); this.distributedBaseInterface.set (session.getId (), json, session.getMaxInativeInterval ()); } // Удалить сеанс public void eMervesession (DivitwedHttpSessionWrapper Session) {DistributedBaseInterface.del (session.getId ()); } public void истекает (DistributedHttpsessionWrapper Session) {DiviutedBaseInterface.expire (session.getId (), session.getMaxInativeInterVal ()); } /** * Создать SID из cookie * /public String [] createUserSid (httpservletrequest запрос, string key) {// ...} public String getActualsId (String usersId, httpservletRequest, запрос String Key) {//}}}}}}}}}}}}}}}}}}}}}3. DistributedhttpsessionWrapper реализует Httpsession и выполняет распределенную упаковку сеанса, код базового времени:
Общедоступный класс DistributedHttpsessionWrapper реализует httpsession {private httpsession orgisession; частная строка SID; логическое изменение = false; логический невидимый = false; Карта <string, object> allattribute; Public DistributedHttpsessionWrapper (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, значение объекта) {изменено = true; allattribute.put (имя, значение); } @Override public Object getAttribute (string name) {return allattribute.get (name); } @Override public enumeration <string> getAttributeNames () {set <stry> set = allattribute.keySet (); Iterator <string> iterator = set.iterator (); вернуть новую MyEnumeration <String> (итератор); } Частный класс MyEnumeration <T> реализует перечисление <t> {итератор <t> итератор; public myenumeration (итератор <t> итератор) {super (); this.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) {изменено = true; allattribute.remove (имя); } @Override public long getCreationTime () {return orgisession.getCreationTime (); } @Override public long getLastAccessationTime () {return orgisession.getLastAccestmentTime (); } @Override public int getMaxInativeInterval () {return orgisession.getMaxInativeInterval (); } @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, object arg1) {orgisession.putValue (arg0, arg1); } @Override public void removeValue (String arg0) {orgisession.RemoveValue (arg0); } @Override public void setMaxInativeInterval (int arg0) {orgisession.setmaxInativeInterval (arg0); } @Override public httpsessionContext getSessionContext () {return orgisession.getSessionContext (); }4. Distributedhttpservletrequestwrapper реализует httpservletrequestwrapper, завершает обработанную сеанс и исходный запрос, код основного: код основного:
Общедоступный класс DistributedHttpServletRequestWrapper Extends javax.servlet.http.httpservletrequestwrapper {private httpservletrequest orgirequest; Private DistributedhttpsessionWrapper Session; Public DistributeDhttpserVletRequestWrapper (httpservletrequest, DivibutedHttpsessionWrapper Session) {super (запрос); if (session == null) {// обработка исключений. Полем } if (request == null) {// обработка исключений. Полем } this.orgirequest = запрос; this.session = session; } public DistributedHttpsessionWrapper getSession (Boolean Create) {orgirequest.getSession (create); возвратный сеанс; } public DistributedHttpsessionWrapper getSession () {return Session; }}5. Кроме того, определите интерфейс DistributedBaseInterface для обработки сеанса в REDIS для операций на стойкость:
Общедоступный интерфейс DistributedBaseInterface { / ** * Получить кэшированные данные на основе клавиши * @param ключа * @param * / public String get (String Key, int Seconds); / ** * Обновление CACHED DATA * @param КЛЮЧ * @Param JSON * @param Seconds */ public void set (String Key, String Json, Int Seconds); / *** Удалить кеш* @param ключ*/ public void del (String Key); / ** * Установить истекшие данные * @param ключа * @param seconds */ public void истекает (String Key, Int Seconds);Примечание. В этой статье используется метод REDIS только для управления сеансами весной, и существует множество других методов реализации, таких как конфигурация в контейнерах и т. Д., И разрабатывает алгоритм маршрутизации, чтобы сеансы полагаться на различные серверы узлов в кластер, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,.,,,,,,,,,,,,,,,,,,,,.,,,,.,,,,,,.,,,,,,,.,,,,,,,, ,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.