前言
并发登陆人数控制就是控制同一账号最大有效会话数。而项目中会话管理交给shiro控制,shiro的sessionId每次是不一样的,也就是说,同一用户登录,在缓存中通过用户名产生的会话id不一样,造成同一用户登录重新登录会变成不同用户而使在线人数不对。
当然,对于这些实时性的统计,我觉得利用redis缓存会话更优,但鉴于个人经验和能力问题,暂时用shiro管理。
过滤器
首先定义一个KickoutSessionFilter过滤器继承shiro的AccessControlFilter,用于拦截登录请求,并且在shiro配置文件中
配置和初始化相应属性,在echache.xml配置
一般涉及缓存都需要同步缓存,也就是当有会话失效时。利用一个监听器将该会话同步掉
而过滤器核心思想就是先判断该会话是否有效或者是否已存在,然后放在一个缓存队列中,如果其大小超过该会话数,就踢出头或尾会话,在加入该会话,然后就是这个缓存队列是通过ehcache中命名用户名设置的,然后将其放在shiro拦截器,放在登录请求中,这是如果有会话被提出,但是本地缓存sessionDAO中任然有那个被踢掉的缓存,需要个监听器根据那个用户名得到sessionId然后踢掉,缓存同步
码上有戏
|
|