SpringBoot2.0之使用Session监听器

本文主要记录了在SpringBoot2.0中使用SessionListener来实现Session的创建和销毁的监听来实现在线访问人数的统计。

1.创建OnLineCountListener

@WebListener
public class OnLineCountListener implements HttpSessionListener {
    private final static Logger LOG = LoggerFactory.getLogger(OnLineCountListener.class);

    private AtomicInteger onLineCount = new AtomicInteger(0);

    public void sessionCreated(HttpSessionEvent event) {
        LOG.info("创建Session");
        event.getSession().getServletContext().setAttribute("onLineCount", onLineCount.incrementAndGet());
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent event) {
        LOG.info("销毁Session");
        event.getSession().getServletContext().setAttribute("onLineCount", onLineCount.decrementAndGet());
    }
}

创建OnLineCountListener 实现 HttpSessionListener 接口,并重写方法。使用AtomicInteger 来统计在线人数。并给创建好的Listener加入@WebListener注解来注册监听器。

2.使@WebListener生效

仅仅使用上述实现并没有很好的达到目的。DEBUG调试发现,尽管使用@WebListener注解注册了监听器,但是并不能很好的工作。需要在启动类里加入@ServletComponentScan来使@WebListener等注解生效

/**
 * 使用 @ServletComponentScan注解后,Servlet、Filter、Listener
 * 可以直接通过 @WebServlet、@WebFilter、@WebListener 注解自动注册,无需其他代码
 */
@SpringBootApplication
@ServletComponentScan
public class IblogApplication {

    public static void main(String[] args) {
        SpringApplication.run(IblogApplication.class, args);
    }
}

3.测试

可以通过修改Session的过期时间来测试

server.servlet.session.timeout=30s

默认请求如果不使用HttpSession,好像是不会自动创建的,这里使用SpringMVC,在请求的方法里声明HttpSession session即可创建,尽管方法里不使用这个变量。

@RequestMapping(value = "/index.html", method = RequestMethod.GET)
public String index(HttpSession session, 
    ModelMap map, @RequestParam(name = "pageNo", defaultValue = "1") int pageNo) {
    // Code
}
效果

你可能感兴趣的