首先,需要一个Listener实现Session监听器的接口HttpSessionListener
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession;import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; @Component public class OnlineCountListener implements HttpSessionListener { public static int count=0; protected final static Logger logger = LoggerFactory.getLogger(OnlineCountListener.class); @Override public void sessionDestroyed(HttpSessionEvent se) { count--; logger.info("session销毁,count--, count="+count); se.getSession().setAttribute("count",count);
// 以下三行为另外一种获取request和session的方法 // HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); // HttpSession session = request.getSession(); // session.setAttribute("count", count); } @Override public void sessionCreated(HttpSessionEvent se) { count++; logger.info("session创建,count++, count="+count); se.getSession().setAttribute("count", count); } }
HttpSessionListener一共有两个方法,顾名思义,一个用来监听系统创建session,一个用来监听系统销毁session。
这里使用静态变量count来记录当前在线人数。
通过@Component注解将类放入Spring中管理。
其次,需要通过@Configuration将监听类加载到项目启动中。
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.web.servlet.ServletListenerRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class PeWebConfigurer implements WebMvcConfigurer { @Autowired
private OnlineCountListener onlineCountListener; @Bean public ServletListenerRegistrationBean listenerRegist() { ServletListenerRegistrationBean srb = new ServletListenerRegistrationBean(); srb.setListener(onlineCountListener); System.out.println("listener"); return srb; } }
如此,在项目启动过程中,就可以看到监听器被注册的信息了
最后,说一下调用获取在线人数。
刚刚已经介绍了,这里的count是静态变量,所以可以直接通过 OnlineCountListener.count获取结果