← 返回首页
SpringBoot基础教程(二十四)
发表时间:2020-10-29 12:00:40
Listener(监听器)

监听器(Listener)是一种 Servlet 中特殊的类,它们能帮助开发者监听 web 中特定的事 件,比如 ServletContext, HttpSession, ServletRequest 的创建和销毁;变量的创建、销毁和修改等。 可以在某些动作前后增加处理,实现监控。

监听器较常用的功能就是用来监听session对象,来获取在线用户数量,现在有很多开发者都有自己的网站,监听 session 来获取当前在下用户数量是个很常见的使用场景,下面来介绍一下如何使用SpringBoot监听器实现统计在线人数功能。

实现步骤:

1.创建监听器类。

在component包下创建MyHttpSessionListener。

package com.oracle.component;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

@Component
public class MyHttpSessionListener implements HttpSessionListener {

    private static final Logger logger = LoggerFactory.getLogger(MyHttpSessionListener.class);

    public Integer count = 0;

    //监听会话的创建
    @Override
    public synchronized void sessionCreated(HttpSessionEvent se) {
        logger.info("新用户上线了");
        count++;
        se.getSession().getServletContext().setAttribute("count", count);
    }

    //监听会话的销毁
    @Override
    public synchronized void sessionDestroyed(HttpSessionEvent se) {
        logger.info("用户下线了");
        count--;
        se.getSession().getServletContext().setAttribute("count", count);
    }
}

2.启动类上添加扫描component包。

package com.oracle;

import org.springframework.boot.Banner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.ansi.AnsiOutput;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.core.SpringVersion;

@SpringBootApplication
@ServletComponentScan({"com.oracle.filter","com.oracle.component"})
public class MySpringBootApplication {

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

        AnsiOutput.setEnabled(AnsiOutput.Enabled.ALWAYS);
        new SpringApplicationBuilder(MySpringBootApplication.class)//
                .main(SpringVersion.class) // 这个是为了可以加载 Spring 版本
                .bannerMode(Banner.Mode.CONSOLE)// 控制台打印
                .run(args);
    }

}

3.在UsersController中的登录方法中输出在线人数。

package com.oracle.controller;

import com.oracle.entity.Users;
import com.oracle.json.JsonData;
import com.oracle.json.JsonResult;
import com.oracle.service.UsersService;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

@RestController
@RequestMapping("users")
public class UsersController {

    @Resource
    private UsersService usersService;
    @GetMapping("/")
    public JsonData login(String username, String password, HttpServletRequest request) {

        Users loginUser = usersService.login(username, password);
        if (loginUser != null) {
            //如果用户登录成功。显示当前的在线人数
            Integer count = (Integer) request.getSession().getServletContext().getAttribute("count");
            System.out.println("当前在线人数:" + count);

            return JsonResult.success(loginUser, "loginSuccess");
        }
        return JsonResult.fail("loginFailure");
    }

}

4.在浏览器地址栏访问用户登录接口 测试使用不同的浏览器访问,由于不同的浏览器认为是不同的客户端,所以会创建新会话(session)。

控制台会输出在线人数信息。效果如下: