今天给大家分享这个吧。
利用Springboot中的session监听器去实现统计在线用户数量的需求(当然其实用shiro或者security是框架自己带有会话管理的,用起来更加方便)。
但是, 接下来这个是非常简单直接快速的实现这个需求,不废话了
上代码:
第一步 . 既然用监听器实现,那肯定得创建监听器了。
创建SessionListener.class
我用的是最直接的注解方式,图方便。
这边的关键是两点,①@WebListener ②implements HttpSessionListener
其他的思路看代码就能看懂,而且也做了注释。
import javax.servlet.annotation.WebListener; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; /** * @Author : JCccc * @CreateTime : 2018-11-15 * @Description : * @Point: Keep a good mood **/ @WebListener public class SessionListener implements HttpSessionListener{ private int onlineCount = 0;//记录session的数量 /** * session创建后执行 */ @Override public void sessionCreated(HttpSessionEvent se) { onlineCount++; System.out.println("【HttpSessionListener监听器】 sessionCreated, onlineCount:" + onlineCount); //将最新的onlineCount值存起来 se.getSession().getServletContext().setAttribute("onlineCount", onlineCount); } /** * session失效后执行 */ @Override public void sessionDestroyed(HttpSessionEvent se) { if (onlineCount > 0) { onlineCount--; } System.out.println("【HttpSessionListener监听器】 sessionDestroyed, onlineCount:" + onlineCount); //将最新的onlineCount值存起来 se.getSession().getServletContext().setAttribute("onlineCount", onlineCount); } }
第二步. 好了其实已经完成了。
接下来就是单纯的校验:
首先模拟一个系统的登录接口,
@GetMapping("/login") public String login(HttpSession session){ //模拟一个用户调用了登录接口,进入系统 return "用户登录"; }
然后在浏览器访问一下,假装登录:
这时候,你可以看到控制台输出了:
是的,已经统计到一个了。
然后你可以继续用浏览器访问,你会发现控制台不会继续输出,因为你的ip对应的这个session还没过期,这就避免了重复统计。
然后,你把你的这个/login丢给你身边的小伙伴测试下,你就会发现控制台又输出了,而且 onlineCount变成2了。
最后,再写个获取这个统计值 onlineCount吧:
@GetMapping("/getOnlineCount") public String getOnlineCount(HttpServletRequest httpServletRequest){ HttpSession session = httpServletRequest.getSession(); //将session监听器的统计在线人数给拿出来~ Object onlineCount=session.getServletContext().getAttribute("onlineCount"); //展示一下,看看 return "onlineCount : "+onlineCount; }
再贴一个图,session过期了就会这样~
好了,就到此吧,顺便一提,在监听器那边是可以每次统计之后,不止set进session里面,还可以存数据库。