이 기사에서 SpringBoot의 프로젝트는 httpsessionListener 리스너 (청취자 중 하나)를 사용하여 온라인으로 사람들의 수를 계산하는데, 이는 본질적으로 세션 수를 계산하는 것입니다.
아이디어는 매우 간단하지만 처리하지 않은 세부 사항이 있으므로 버그를 완료하기 전에 하루 이상 디버깅했습니다.
먼저 httpsessionlistener 리스너를 작성하십시오. 수는 세션 수 (사람 수)입니다. 세션이 만들어지면 청취자의 세션 크리테이션 메소드가 트리거됩니다. 세션이 파괴되면 청취자의 세션이 파괴 된 방법이 트리거됩니다. 리스너의 사람 수를 계산 한 후 ServletContext에 넣습니다 (모든 요청이 내부에 속성을 저장하고 얻을 수있는 저장소로 이해할 수 있습니다).
리스너에 @weblistener를 추가하는 데주의를 기울이므로 구성 할 필요가 없습니다.
@weblistener public class onlinecount emplements httpsessionlistener {public int count = 0; // 세션 수를 기록하십시오. // 세션의 생성, 동기화 방지 버그 동기화 void sessioncreated (httpssessionEvent arg0) {system.out.println ( "httpsessionner wallistner++ 증가 카운트 ++; arg0.getSession (). getServletContext (). setAttribute ( "count", count); } @override public synchronized void sessiondestroyed (httpsessionevent arg0) {// 반복 세션의 Rebocation System.out.println ( "【httpsessionListener Listener】 count- rete"); 세다--; arg0.getSession (). getServletContext (). setAttribute ( "count", count); }}그런 다음 세션 수를 쿼리하는 컨트롤러를 작성하십시오. 나는 다음으로 시작했다.
ServletContext에서 카운트를 가져 와서 프론트 엔드로 반환하십시오.
@requestmapping ( "/count") @ResponseBody public string count (httpservletRequest httpservletRequest, httpservletResponse httpservletResponse) {개체 count = httpservletRequest.getServletContext (). getAttribute ( "count"); 반환 "count :"+count; }이것은 잘못되었습니다. 세션이 생성되지 않기 때문에이 카운트가 NULL이라는 페이지가 표시되고 리스너를 트리거하는 통계적 방법이 없습니다. 그러니 바꾸십시오 :
@Controller public class indexcontroller {@requestmapping ( "/count") @ResponseBody public string count (httpservletRequest httpservletResponse httpservletResponse) {httpsession session = httpservletrequest.getsestions (); 객체 count = session.getServletContext (). getAttribute ( "count"); 반환 "count :"+count; }} httpsession session = httpservletrequest.getSession (); 기능 : 사용자가 세션이 없으면 세션을 만들고 세션이 있으면 세션이 있으면 세션을 작성하지 않습니다.
이 테스트로 변경하는 것이 옳은 것처럼 보이지만 문제가 있습니다. 브라우저는 세션에 해당합니다. 2 개의 브라우저를 열면 카운트가 2라는 것을 알 수 있습니다. 그러나 브라우저를 닫고 열면 2 여야하고 변경되지 않아야하지만 3이됩니다. 그 이유는 세션 파괴 방법이 실행되지 않기 때문입니다. 다시 열면 서버는 사용자의 원래 세션을 찾아 세션을 재현 할 수 없습니다. 따라서 3 개의 세션이 있지만 브라우저는 2 개 밖에 없으므로 시뮬레이션에는 온라인으로 2 명만 있어야합니다.
이 문제를 해결하는 방법에는 두 가지가 있습니다. 하나는 웹 페이지를 닫을 때 세션을 파괴하는 메소드를 호출하는 것입니다. 또 다른 더 좋은 방법은 서버가 원래 세션, 즉 원래 세션을 브라우저에 기록하고 다음에 열 때 SessionID를 보내서 서버가 재현하지 않도록하는 것입니다.
코드는 다음과 같이 수정됩니다.
@controller public class indexcontroller {@requestmapping ( "/count") @ResponseBody public string 번호 (httpservletRequest httpservletrequest, httpservletResponse httpservletResponse) {// browser cookie c = 새 쿠키 ( "jsessiond" urlencoder.encode (httpservletrequest.getSession (). getId (), "utf-8")); c.setpath ( "/"); // 쿠키 유효 기간을 먼저 2 일 ~ 2 일 동안 설정하면 걱정하지 마십시오. 세션은 2 일 동안 저장되지 않습니다. c.setMaxage (48 * 60 * 60); httpservletresponse.addcookie (c); } catch (예외 e) {e.printstacktrace (); } httpsession session = httpservletrequest.getSession (); 객체 count = session.getServletContext (). getAttribute ( "count"); 반환 "count :"+count; }}요약
위는 편집자가 소개 한 온라인 사용자를 계산하기 위해 모니터를 사용하여 SpringBoot의 사례 분석입니다. 모든 사람에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨 주시면 편집자가 제 시간에 모든 사람에게 답장을 드리겠습니다. Wulin.com 웹 사이트를 지원해 주셔서 대단히 감사합니다!