В этой статье проект в Springboot использует слушателя HttpsessionListener (одного из слушателей) для подсчета количества людей в Интернете, что, по сути, для подсчета количества сеансов.
Идея очень проста, но есть детали, с которыми я не справился, поэтому я отлаживал ее больше, чем за день до того, как сделала ошибку.
Сначала напишите слушатель httpsessionListener. Подсчет - это количество сеансов (количество людей). Когда сеанс будет создан, метод прослушивателя, созданный сеансом, будет вызван. Когда сеанс будет уничтожен, будет запускается метод прослушивателя. После расчета количества людей в слушателе, поместите его в ServletContext (его можно понять как репозиторий, где любой запрос может хранить и получить свойства внутри).
Обратите внимание на добавление @weblistener к слушателю, чтобы его настраивали.
@Weblistener public class onlinecount реализует httpsessionlistener {public int count = 0; // Записать количество сеансов // прослушивание создания сеанса, синхронизированная антиккуррентная ошибка публичная синхронизированная сеанс сеанса (httpsessionEvent arg0) {system.out.println («httpsessionLister gristener rag0) {system.out.println (« httpsessionLister grishese arg {{system.out.println (【httpsessionLister】】】 {{system.out.println («httpsessionEvent rag0) count ++; arg0.getSession (). getServletContext (). SetAtTribute ("count", count); } @Override public synchronized void sessionDestroyed (httpsessionEvent arg0) {// Система отзывы повторного сеанса.out.println ("【httpsessionListener слушатель】 count- Reduce"); считать--; arg0.getSession (). getServletContext (). SetAtTribute ("count", count); }}Затем напишите контроллер, который запрашивает количество сеансов. Я начал со следующего, что неправильно!
Возьмите счет из ServletContext и возврат к передней части.
@Requestmapping ("/count") @Responsebody public String Count (httpservletrequest httpservletrequest, httpservletresponse httpservletresponse) {count = httpservletrequest.getservletcontext (). Getattribute ("count"); вернуть "count:"+count; }Это неправильно. Вы обнаружите, что страница видит, что счет является нулевым, потому что сеанс не создан, и не существует статистического метода для запуска слушателя. Так что измените это:
@Controller public class indexcontroller {@requestmapping ("/count") @responsebody public String Count (httpservlectrequest httpservletrequest, httpservletresponse httpservletresponse) {httpsession session = httpsersequest.getsession (); COUNCT = SESSION.GETSERVLETCONTEXT (). GETATTRIBUTE ("count"); вернуть "count:"+count; }} Httpsession session = httpservletrequest.getsession (); Функция: Если у пользователя нет сеанса, он создаст сеанс, и если будет сеанс, он не создаст его.
Кажется правильным изменить его на этот тест, но есть проблема. Браузер соответствует сеансу. Если вы откроете 2 браузера, вы увидите, что счет 2, что правильно. Но если вы закрываете браузер и откроете его, он должен быть 2 и оставаться неизменным, но он становится 3. Причина в том, что метод разрушения сеанса не выполняется. При повторном открытии сервер не может найти оригинальный сеанс пользователя и воссоздать сеанс. Таким образом, есть 3 сеанса, но есть только 2 браузера, что означает, что в онлайн -симуляторе должно быть всего 2 человека.
Есть два способа решить эту проблему. Один из них - вызвать метод для уничтожения сеанса при закрытии веб -страницы. Еще один лучший способ - позволить серверу запомнить оригинальный сеанс, то есть записать оригинальный SessionId в браузере и отправить SessionId в следующий раз, когда вы его открываете, чтобы сервер не воссоздал его.
Код изменен следующим образом:
@Controller public class indexcontroller {@requestmapping ("/count") @responsebody public String № Urlencoder.encode (httpservletrequest.getSession (). GetId (), "UTF-8")); c.setpath ("/"); // Установите период достоверности cookie первым и 2 дням, не волнуйтесь, сеанс не будет сохранен в течение 2 дней c.setmaxage (48 * 60 * 60); httpservletresponse.addcookie (c); } catch (Exception e) {e.printstackTrace (); } Httpsession session = httpservletrequest.getSession (); COUNCT = SESSION.GETSERVLETCONTEXT (). GETATTRIBUTE ("count"); вернуть "count:"+count; }}Суммировать
Выше приведено анализ Springboot с использованием мониторов для подсчета онлайн -пользователей, представленных редактором. Я надеюсь, что это будет полезно для всех. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит всем вовремя. Большое спасибо за вашу поддержку сайту wulin.com!