springboot使用HttpSessionListener监听器统计在线用户数
生活随笔
收集整理的這篇文章主要介紹了
springboot使用HttpSessionListener监听器统计在线用户数
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
目錄:
- 實(shí)體類
- 自定義事件
- 自定義監(jiān)聽器
- 使用HttpSessionListener作監(jiān)聽器
- Servlet監(jiān)聽器
- controller層
實(shí)體類
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;/*** 發(fā)布事件* @return*/public User getUser2() {User user = new User(1L, "小明", "123456");// 發(fā)布事件MyEvent event = new MyEvent(this, user);applicationContext.publishEvent(event);return user;}/*** 獲取用戶信息* @return*/public User getUser() {// 實(shí)際中會(huì)根據(jù)具體的業(yè)務(wù)場(chǎng)景,從數(shù)據(jù)庫(kù)中查詢對(duì)應(yīng)的信息return new User(1L, "小明", "123456");} }自定義監(jiān)聽器
@Component public class MyEventListener implements ApplicationListener<MyEvent> {@Overridepublic void onApplicationEvent(MyEvent myEvent) {// 把事件中的信息獲取到User user = myEvent.getUser();// 處理事件,實(shí)際項(xiàng)目中可以通知?jiǎng)e的模塊或者處理其他邏輯等等System.out.println("用戶名:" + user.getUsername());System.out.println("密碼:" + user.getPassword());} }使用HttpSessionListener作監(jiān)聽器
@Component public class MyHttpSessionListener implements HttpSessionListener {private static final Logger logger = LoggerFactory.getLogger(MyHttpSessionListener.class);/*** 記錄在線的用戶數(shù)量*/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監(jiān)聽器
@Component public class MyServletContextListener implements ApplicationListener<ContextRefreshedEvent> {@Overridepublic void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {// 先獲取到application上下文ApplicationContext applicationContext = contextRefreshedEvent.getApplicationContext();// 獲取對(duì)應(yīng)的serviceUserService userService = applicationContext.getBean(UserService.class);User user = userService.getUser();// 獲取application域?qū)ο?#xff0c;將查到的信息放到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");}/*** 獲取當(dāng)前在線人數(shù)* @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("/");//設(shè)置cookie有效期為2天,設(shè)置長(zhǎng)一點(diǎn)cookie.setMaxAge( 48*60 * 60);response.addCookie(cookie);} catch (UnsupportedEncodingException e) {e.printStackTrace();}Integer count = (Integer) request.getSession().getServletContext().getAttribute("count");return "當(dāng)前在線人數(shù):" + count;}@GetMapping("/request")public String getRequestInfo(HttpServletRequest request) {System.out.println("requestListener中的初始化的name數(shù)據(jù):" + request.getAttribute("name"));return "success";}@GetMapping("/publish")public User publishEvent() {return userService.getUser2();}}運(yùn)行結(jié)果:
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的springboot使用HttpSessionListener监听器统计在线用户数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【springboot中使用拦截器】
- 下一篇: rabbitmq的启动命令和spring