欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

springboot使用HttpSessionListener监听器统计在线用户数

发布时间:2024/9/30 编程问答 40 豆豆
生活随笔 收集整理的这篇文章主要介绍了 springboot使用HttpSessionListener监听器统计在线用户数 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

目录:

    • 实体类
    • 自定义事件
    • 自定义监听器
    • 使用HttpSessionListener作监听器
    • Servlet监听器
    • controller层

实体类

public class User {private Long id;private String username;private String password;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public User(Long id, String username, String password) {this.id = id;this.username = username;this.password = password;}public User() {} }

自定义事件

public class MyEvent extends ApplicationEvent {private User user;public MyEvent(Object source, User user) {super(source);this.user = user;}public User getUser() {return user;}public void setUser(User user) {this.user = user;} }

service:

```java @Service public class UserService {@Resourceprivate ApplicationContext applicationContext;/*** 发布事件* @return*/public User getUser2() {User user = new User(1L, "小明", "123456");// 发布事件MyEvent event = new MyEvent(this, user);applicationContext.publishEvent(event);return user;}/*** 获取用户信息* @return*/public User getUser() {// 实际中会根据具体的业务场景,从数据库中查询对应的信息return new User(1L, "小明", "123456");} }

自定义监听器

@Component public class MyEventListener implements ApplicationListener<MyEvent> {@Overridepublic void onApplicationEvent(MyEvent myEvent) {// 把事件中的信息获取到User user = myEvent.getUser();// 处理事件,实际项目中可以通知别的模块或者处理其他逻辑等等System.out.println("用户名:" + user.getUsername());System.out.println("密码:" + user.getPassword());} }

使用HttpSessionListener作监听器

@Component public class MyHttpSessionListener implements HttpSessionListener {private static final Logger logger = LoggerFactory.getLogger(MyHttpSessionListener.class);/*** 记录在线的用户数量*/public Integer count = 0;@Overridepublic synchronized void sessionCreated(HttpSessionEvent httpSessionEvent) {logger.info("新用户上线了");count++;httpSessionEvent.getSession().getServletContext().setAttribute("count", count);}@Overridepublic synchronized void sessionDestroyed(HttpSessionEvent httpSessionEvent) {logger.info("用户下线了");count--;httpSessionEvent.getSession().getServletContext().setAttribute("count", count);} }

Servlet监听器

@Component public class MyServletContextListener implements ApplicationListener<ContextRefreshedEvent> {@Overridepublic void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {// 先获取到application上下文ApplicationContext applicationContext = contextRefreshedEvent.getApplicationContext();// 获取对应的serviceUserService userService = applicationContext.getBean(UserService.class);User user = userService.getUser();// 获取application域对象,将查到的信息放到application域中ServletContext application = applicationContext.getBean(ServletContext.class);application.setAttribute("user", user);} } @Component public class MyServletRequestListener implements ServletRequestListener {private static final Logger logger = LoggerFactory.getLogger(MyServletRequestListener.class);@Overridepublic void requestInitialized(ServletRequestEvent servletRequestEvent) {HttpServletRequest request = (HttpServletRequest) servletRequestEvent.getServletRequest();logger.info("session id为:{}", request.getRequestedSessionId());logger.info("request url为:{}", request.getRequestURL());request.setAttribute("name", "小明");}@Overridepublic void requestDestroyed(ServletRequestEvent servletRequestEvent) {logger.info("request end");HttpServletRequest request = (HttpServletRequest) servletRequestEvent.getServletRequest();logger.info("request域中保存的name值为:{}", request.getAttribute("name"));}}

controller层

@RestController @RequestMapping("/listener") public class TestController {@Resourceprivate UserService userService;@GetMapping("/user")public User getUser(HttpServletRequest request) {ServletContext application = request.getServletContext();return (User) application.getAttribute("user");}/*** 获取当前在线人数* @param request* @return*/@GetMapping("/total2")public String getTotalUser(HttpServletRequest request, HttpServletResponse response) {Cookie cookie;try {// 把sessionId记录在浏览器中cookie = new Cookie("JSESSIONID", URLEncoder.encode(request.getSession().getId(), "utf-8"));cookie.setPath("/");//设置cookie有效期为2天,设置长一点cookie.setMaxAge( 48*60 * 60);response.addCookie(cookie);} catch (UnsupportedEncodingException e) {e.printStackTrace();}Integer count = (Integer) request.getSession().getServletContext().getAttribute("count");return "当前在线人数:" + count;}@GetMapping("/request")public String getRequestInfo(HttpServletRequest request) {System.out.println("requestListener中的初始化的name数据:" + request.getAttribute("name"));return "success";}@GetMapping("/publish")public User publishEvent() {return userService.getUser2();}}

运行结果:

与50位技术专家面对面20年技术见证,附赠技术全景图

总结

以上是生活随笔为你收集整理的springboot使用HttpSessionListener监听器统计在线用户数的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。