springboot使用HttpSessionListener 監聽器統計當前在線人數


概括:

request.getSession(true):若存在會話則返回該會話,否則新建一個會話。

request.getSession(false):若存在會話則返回該會話,否則返回NULL

 

https://blog.csdn.net/qq_38091831/article/details/82912831

原理就是很簡單,就是利用HttpSessionListener 監聽session的創建和銷毀,然后定義個靜態變量存儲在線人數的變化。 說兩種方式,第一種是使用配置類,第二種是使用@WebListener注解,都差不多 方式一:使用配置類 1.創建session監聽器 package com.sdsft.pcweb.common.listener; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; public class MyHttpSessionListener implements HttpSessionListener { public static int online = 0; @Override public void sessionCreated(HttpSessionEvent se) { System.out.println("創建session"); online ++; } @Override public void sessionDestroyed(HttpSessionEvent se) { System.out.println("銷毀session"); online --; } } 2.配置類 package com.sdsft.pcweb.common.config; import com.sdsft.pcweb.common.listener.MyHttpSessionListener; import org.springframework.boot.web.servlet.ServletListenerRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class MywebConfig implements WebMvcConfigurer { @Bean public ServletListenerRegistrationBean listenerRegist() { ServletListenerRegistrationBean srb = new ServletListenerRegistrationBean(); srb.setListener(new MyHttpSessionListener()); System.out.println("listener"); return srb; } } 3.控制器 package com.sdsft.pcweb.controller; import com.sdsft.pcweb.common.entity.CommonResult; import com.sdsft.pcweb.common.enums.ResultEnum; import com.sdsft.pcweb.common.listener.MyHttpSessionListener; import com.sdsft.pcweb.service.LoginService; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; /** * LoginController class * @author zcz * @date 2018/09/20 */ @RequestMapping("/userInfo") @RestController public class LoginController { private static Logger logger = LoggerFactory.getLogger(LoginController.class); /** * 登錄 */ @PostMapping("/Login") public void getUserByUserNameAndPassword(String username, String password, HttpSession session) { logger.info("用戶【"+username+"】登陸開始!"); if("admin".equals(username) && "123456".equals(password)){ session.setAttribute("loginName",username); logger.info("用戶【"+username+"】登陸成功!"); }else{ logger.info("用戶【"+username+"】登錄失敗!"); } } /** *查詢在線人數 */ @RequestMapping("/online") public Object online() { return "當前在線人數:" + MyHttpSessionListener.online + "人"; } /** * 退出登錄 */ @RequestMapping("/Logout") public CommonResult Logout( HttpServletRequest request) { logger.info("用戶退出登錄開始!"); HttpSession session = request.getSession(false);//防止創建Session if(session != null){ session.removeAttribute("loginName"); session.invalidate(); } logger.info("用戶退出登錄結束!"); return new CommonResult(ResultEnum.SUCCESS.getCode(), "退出成功!"); } /** * 判斷session是否有效 * @param httpServletRequest * @return */ @RequestMapping("/getSession") public String getSession(HttpServletRequest httpServletRequest) { HttpSession session = httpServletRequest.getSession(); String loginName = (String) session.getAttribute("loginName"); if (StringUtils.isNotBlank(loginName)) { return "200"; } return ""; } } 測試一下吧 方式二:使用@WebListener注解 1.創建監聽器,加注解@WebListener package com.sdsft.pcweb.common.listener; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; @WebListener public class MyHttpSessionListener implements HttpSessionListener { public static int online = 0; @Override public void sessionCreated(HttpSessionEvent se) { System.out.println("創建session"); online ++; } @Override public void sessionDestroyed(HttpSessionEvent se) { System.out.println("銷毀session"); online --; } } 2.控制器 package com.sdsft.pcweb.controller; import com.sdsft.pcweb.common.entity.CommonResult; import com.sdsft.pcweb.common.enums.ResultEnum; import com.sdsft.pcweb.common.listener.MyHttpSessionListener; import com.sdsft.pcweb.service.LoginService; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; /** * LoginController class * @author zcz * @date 2018/09/20 */ @RequestMapping("/userInfo") @RestController public class LoginController { private static Logger logger = LoggerFactory.getLogger(LoginController.class); /** * 登錄 */ @PostMapping("/Login") public void getUserByUserNameAndPassword(String username, String password, HttpSession session) { logger.info("用戶【"+username+"】登陸開始!"); if("admin".equals(username) && "123456".equals(password)){ session.setAttribute("loginName",username); logger.info("用戶【"+username+"】登陸成功!"); }else{ logger.info("用戶【"+username+"】登錄失敗!"); } } /** *查詢在線人數 */ @RequestMapping("/online") public Object online() { return "當前在線人數:" + MyHttpSessionListener.online + "人"; } /** * 退出登錄 */ @RequestMapping("/Logout") public CommonResult Logout( HttpServletRequest request) { logger.info("用戶退出登錄開始!"); HttpSession session = request.getSession(false);//防止創建Session if(session != null){ session.removeAttribute("loginName"); session.invalidate(); } logger.info("用戶退出登錄結束!"); return new CommonResult(ResultEnum.SUCCESS.getCode(), "退出成功!"); } /** * 判斷session是否有效 * @param httpServletRequest * @return */ @RequestMapping("/getSession") public String getSession(HttpServletRequest httpServletRequest) { HttpSession session = httpServletRequest.getSession(); String loginName = (String) session.getAttribute("loginName"); if (StringUtils.isNotBlank(loginName)) { return "200"; } return ""; } } 3.啟動類加@ServletComponentScan注解,這樣才能在程序啟動時將對應的bean加載進來 package com.sdsft.pcweb; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @SpringBootApplication @ServletComponentScan public class PcwebApplication { public static void main(String[] args) { SpringApplication.run(PcwebApplication.class, args); } } 開始測試吧

 

 

springboot統計當前在線人數,springboot使用HttpSessionListener 監聽器統計當前在線人數,拿來即用,不忽悠

版權聲明:本文為博主原創文章,遵循 CC 4.0 by-sa 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接: https://blog.csdn.net/qq_38091831/article/details/82912831

原理就是很簡單,就是利用HttpSessionListener 監聽session的創建和銷毀,然后定義個靜態變量存儲在線人數的變化。

說兩種方式,第一種是使用配置類,第二種是使用@WebListener注解,都差不多

方式一:使用配置類

1.創建session監聽器

  1.  
    package com.sdsft.pcweb.common.listener;
  2.  
     
  3.  
    import javax.servlet.http.HttpSessionEvent;
  4.  
    import javax.servlet.http.HttpSessionListener;
  5.  
     
  6.  
    public class MyHttpSessionListener implements HttpSessionListener {
  7.  
     
  8.  
    public static int online = 0;
  9.  
    @Override
  10.  
    public void sessionCreated(HttpSessionEvent se) {
  11.  
    System.out.println( "創建session");
  12.  
    online ++;
  13.  
    }
  14.  
     
  15.  
    @Override
  16.  
    public void sessionDestroyed(HttpSessionEvent se) {
  17.  
    System.out.println( "銷毀session");
  18.  
    online --;
  19.  
    }
  20.  
     
  21.  
    }

2.配置類

  1.  
    package com.sdsft.pcweb.common.config;
  2.  
     
  3.  
    import com.sdsft.pcweb.common.listener.MyHttpSessionListener;
  4.  
    import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
  5.  
    import org.springframework.context.annotation.Bean;
  6.  
    import org.springframework.context.annotation.Configuration;
  7.  
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
  8.  
     
  9.  
    @Configuration
  10.  
    public class MywebConfig implements WebMvcConfigurer {
  11.  
    @Bean
  12.  
    public ServletListenerRegistrationBean listenerRegist() {
  13.  
    ServletListenerRegistrationBean srb = new ServletListenerRegistrationBean();
  14.  
    srb.setListener( new MyHttpSessionListener());
  15.  
    System.out.println( "listener");
  16.  
    return srb;
  17.  
    }
  18.  
    }

3.控制器

  1.  
    package com.sdsft.pcweb.controller;
  2.  
     
  3.  
    import com.sdsft.pcweb.common.entity.CommonResult;
  4.  
    import com.sdsft.pcweb.common.enums.ResultEnum;
  5.  
    import com.sdsft.pcweb.common.listener.MyHttpSessionListener;
  6.  
    import com.sdsft.pcweb.service.LoginService;
  7.  
    import org.apache.commons.lang3.StringUtils;
  8.  
    import org.slf4j.Logger;
  9.  
    import org.slf4j.LoggerFactory;
  10.  
    import org.springframework.beans.factory. annotation.Autowired;
  11.  
    import org.springframework.web.bind. annotation.PostMapping;
  12.  
    import org.springframework.web.bind. annotation.RequestMapping;
  13.  
    import org.springframework.web.bind. annotation.ResponseBody;
  14.  
    import org.springframework.web.bind. annotation.RestController;
  15.  
     
  16.  
    import javax.servlet.http.HttpServletRequest;
  17.  
    import javax.servlet.http.HttpSession;
  18.  
     
  19.  
    /**
  20.  
    * LoginController class
  21.  
    * @author zcz
  22.  
    * @date 2018/09/20
  23.  
    */
  24.  
    @RequestMapping("/userInfo")
  25.  
    @RestController
  26.  
    public class LoginController {
  27.  
    private static Logger logger = LoggerFactory.getLogger(LoginController. class);
  28.  
     
  29.  
    /**
  30.  
    * 登錄
  31.  
    */
  32.  
    @PostMapping("/Login")
  33.  
    public void getUserByUserNameAndPassword(String username, String password, HttpSession session) {
  34.  
    logger.info( "用戶【"+username+ "】登陸開始!");
  35.  
    if( "admin".equals(username) && "123456".equals(password)){
  36.  
    session.setAttribute( "loginName",username);
  37.  
    logger.info( "用戶【"+username+ "】登陸成功!");
  38.  
    } else{
  39.  
    logger.info( "用戶【"+username+ "】登錄失敗!");
  40.  
    }
  41.  
    }
  42.  
    /**
  43.  
    *查詢在線人數
  44.  
    */
  45.  
    @RequestMapping("/online")
  46.  
    public Object online() {
  47.  
    return "當前在線人數:" + MyHttpSessionListener.online + "人";
  48.  
    }
  49.  
    /**
  50.  
    * 退出登錄
  51.  
    */
  52.  
    @RequestMapping("/Logout")
  53.  
    public CommonResult Logout( HttpServletRequest request) {
  54.  
    logger.info( "用戶退出登錄開始!");
  55.  
    HttpSession session = request.getSession( false); //防止創建Session
  56.  
    if(session != null){
  57.  
    session.removeAttribute( "loginName");
  58.  
    session.invalidate();
  59.  
    }
  60.  
    logger.info( "用戶退出登錄結束!");
  61.  
    return new CommonResult(ResultEnum.SUCCESS.getCode(), "退出成功!");
  62.  
    }
  63.  
     
  64.  
     
  65.  
    /**
  66.  
    * 判斷session是否有效
  67.  
    * @param httpServletRequest
  68.  
    * @return
  69.  
    */
  70.  
    @RequestMapping("/getSession")
  71.  
    public String getSession(HttpServletRequest httpServletRequest) {
  72.  
    HttpSession session = httpServletRequest.getSession();
  73.  
    String loginName = (String) session.getAttribute( "loginName");
  74.  
    if (StringUtils.isNotBlank(loginName)) {
  75.  
    return "200";
  76.  
    }
  77.  
    return "";
  78.  
    }
  79.  
     
  80.  
    }

測試一下吧

方式二:使用@WebListener注解

1.創建監聽器,加注解@WebListener

  1.  
    package com.sdsft.pcweb.common.listener;
  2.  
     
  3.  
    import javax.servlet.http.HttpSessionEvent;
  4.  
    import javax.servlet.http.HttpSessionListener;
  5.  
    @WebListener
  6.  
    public class MyHttpSessionListener implements HttpSessionListener {
  7.  
     
  8.  
    public static int online = 0;
  9.  
    @Override
  10.  
    public void sessionCreated(HttpSessionEvent se) {
  11.  
    System.out.println( "創建session");
  12.  
    online ++;
  13.  
    }
  14.  
     
  15.  
    @Override
  16.  
    public void sessionDestroyed(HttpSessionEvent se) {
  17.  
    System.out.println( "銷毀session");
  18.  
    online --;
  19.  
    }
  20.  
     
  21.  
    }

2.控制器

  1.  
    package com.sdsft.pcweb.controller;
  2.  
     
  3.  
    import com.sdsft.pcweb.common.entity.CommonResult;
  4.  
    import com.sdsft.pcweb.common.enums.ResultEnum;
  5.  
    import com.sdsft.pcweb.common.listener.MyHttpSessionListener;
  6.  
    import com.sdsft.pcweb.service.LoginService;
  7.  
    import org.apache.commons.lang3.StringUtils;
  8.  
    import org.slf4j.Logger;
  9.  
    import org.slf4j.LoggerFactory;
  10.  
    import org.springframework.beans.factory. annotation.Autowired;
  11.  
    import org.springframework.web.bind. annotation.PostMapping;
  12.  
    import org.springframework.web.bind. annotation.RequestMapping;
  13.  
    import org.springframework.web.bind. annotation.ResponseBody;
  14.  
    import org.springframework.web.bind. annotation.RestController;
  15.  
     
  16.  
    import javax.servlet.http.HttpServletRequest;
  17.  
    import javax.servlet.http.HttpSession;
  18.  
     
  19.  
    /**
  20.  
    * LoginController class
  21.  
    * @author zcz
  22.  
    * @date 2018/09/20
  23.  
    */
  24.  
    @RequestMapping("/userInfo")
  25.  
    @RestController
  26.  
    public class LoginController {
  27.  
    private static Logger logger = LoggerFactory.getLogger(LoginController. class);
  28.  
     
  29.  
    /**
  30.  
    * 登錄
  31.  
    */
  32.  
    @PostMapping("/Login")
  33.  
    public void getUserByUserNameAndPassword(String username, String password, HttpSession session) {
  34.  
    logger.info( "用戶【"+username+ "】登陸開始!");
  35.  
    if( "admin".equals(username) && "123456".equals(password)){
  36.  
    session.setAttribute( "loginName",username);
  37.  
    logger.info( "用戶【"+username+ "】登陸成功!");
  38.  
    } else{
  39.  
    logger.info( "用戶【"+username+ "】登錄失敗!");
  40.  
    }
  41.  
    }
  42.  
    /**
  43.  
    *查詢在線人數
  44.  
    */
  45.  
    @RequestMapping("/online")
  46.  
    public Object online() {
  47.  
    return "當前在線人數:" + MyHttpSessionListener.online + "人";
  48.  
    }
  49.  
    /**
  50.  
    * 退出登錄
  51.  
    */
  52.  
    @RequestMapping("/Logout")
  53.  
    public CommonResult Logout( HttpServletRequest request) {
  54.  
    logger.info( "用戶退出登錄開始!");
  55.  
    HttpSession session = request.getSession( false); //防止創建Session
  56.  
    if(session != null){
  57.  
    session.removeAttribute( "loginName");
  58.  
    session.invalidate();
  59.  
    }
  60.  
    logger.info( "用戶退出登錄結束!");
  61.  
    return new CommonResult(ResultEnum.SUCCESS.getCode(), "退出成功!");
  62.  
    }
  63.  
     
  64.  
     
  65.  
    /**
  66.  
    * 判斷session是否有效
  67.  
    * @param httpServletRequest
  68.  
    * @return
  69.  
    */
  70.  
    @RequestMapping("/getSession")
  71.  
    public String getSession(HttpServletRequest httpServletRequest) {
  72.  
    HttpSession session = httpServletRequest.getSession();
  73.  
    String loginName = (String) session.getAttribute( "loginName");
  74.  
    if (StringUtils.isNotBlank(loginName)) {
  75.  
    return "200";
  76.  
    }
  77.  
    return "";
  78.  
    }
  79.  
     
  80.  
    }

3.啟動類加@ServletComponentScan注解,這樣才能在程序啟動時將對應的bean加載進來

  1.  
    package com.sdsft.pcweb;
  2.  
    import org.springframework.boot.SpringApplication;
  3.  
    import org.springframework.boot.autoconfigure.SpringBootApplication;
  4.  
    import org.springframework.boot.web.servlet.ServletComponentScan;
  5.  
     
  6.  
    @SpringBootApplication
  7.  
    @ServletComponentScan
  8.  
    public class PcwebApplication {
  9.  
    public static void main(String[] args) {
  10.  
    SpringApplication.run(PcwebApplication.class, args);
  11.  
    }
  12.  
    }

開始測試吧


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM