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中使用拦截器】
- 下一篇: 【操作系统】进程间通信的五种方式