springboot使用HttpSessionListener监听器统计在线用户数
生活随笔
收集整理的这篇文章主要介绍了
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监听器统计在线用户数的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 【springboot中使用拦截器】
- 下一篇: rabbitmq的启动命令和spring