最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springboot 用監(jiān)聽器統(tǒng)計(jì)在線人數(shù)案例分析

 更新時(shí)間:2018年02月07日 11:16:14   作者:JavaWeb大牛  
這篇文章主要介紹了springboot 用監(jiān)聽器統(tǒng)計(jì)在線人數(shù)案例分析,質(zhì)是統(tǒng)計(jì)session 的數(shù)量,思路很簡(jiǎn)單,具體實(shí)例代碼大家參考下本文

本文在springboot 的項(xiàng)目,用HttpSessionListener 監(jiān)聽器(監(jiān)聽器的其中一種) 統(tǒng)計(jì)在線人數(shù),實(shí)質(zhì)是統(tǒng)計(jì)session 的數(shù)量。

 思路很簡(jiǎn)單,但是有個(gè)細(xì)節(jié)沒處理好,讓我調(diào)試了大半天,才把bug搞好。

 先寫個(gè)HttpSessionListener 監(jiān)聽器。count  是session的數(shù)量(人數(shù)),session 創(chuàng)建的時(shí)候,會(huì)觸發(fā)監(jiān)聽器的sessionCreated 方法,session銷毀的時(shí)候,會(huì)觸發(fā)監(jiān)聽器的sessionDestroyed 方法。 在監(jiān)聽器中計(jì)算完人數(shù)count,把他放進(jìn)servletContext(可以理解為一個(gè)倉(cāng)庫(kù),任意請(qǐng)求可以存儲(chǔ)和獲取里面的屬性)。
 注意監(jiān)聽器加上@WebListener,這樣就不用配置。

@WebListener 
public class OnLineCount implements HttpSessionListener { 
  public int count=0;//記錄session的數(shù)量 
  //監(jiān)聽session的創(chuàng)建,synchronized 防并發(fā)bug 
  public synchronized void sessionCreated(HttpSessionEvent arg0) { 
    System.out.println("【HttpSessionListener監(jiān)聽器】count++ 增加"); 
    count++; 
    arg0.getSession().getServletContext().setAttribute("count", count); 
  } 
  @Override 
  public synchronized void sessionDestroyed(HttpSessionEvent arg0) {//監(jiān)聽session的撤銷 
    System.out.println("【HttpSessionListener監(jiān)聽器】count-- 減少"); 
    count--; 
    arg0.getSession().getServletContext().setAttribute("count", count); 
  } 
} 

接著寫一個(gè)查詢session 數(shù)量的controller,我開始的時(shí)候是像下面這樣寫的,是錯(cuò)誤的!

從servletContext 中取出count ,把count返回前端。

@RequestMapping("/count") 
@ResponseBody 
public String count(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse){ 
  Object count=httpServletRequest.getServletContext().getAttribute("count"); 
  return "count : "+count; 
} 

這樣是錯(cuò)誤的,測(cè)試你會(huì)發(fā)現(xiàn),頁(yè)面看到count  是null ,因?yàn)闆]有創(chuàng)建session,沒有觸發(fā)監(jiān)聽器的統(tǒng)計(jì)方法。于是改一下:

@Controller 
public class IndexController { 
  @RequestMapping("/count") 
  @ResponseBody 
  public String count(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse){ 
    HttpSession session = httpServletRequest.getSession(); 
    Object count=session.getServletContext().getAttribute("count"); 
    return "count : "+count; 
  } 
} 

 HttpSession session = httpServletRequest.getSession();  作用:該用戶如果沒有sesision則創(chuàng)建session ,有則取得session不創(chuàng)建。

 改成這樣測(cè)試,看起來是對(duì)的,但是有個(gè)問題。一個(gè)瀏覽器對(duì)應(yīng)一個(gè)session,你打開2個(gè)瀏覽器,看到count是2 ,是對(duì)的。但是你關(guān)了一個(gè)瀏覽器,再打開,應(yīng)該是2不變才對(duì),但是變成3 了,原因是session銷毀的方法沒有執(zhí)行,重新打開時(shí),服務(wù)器找不到用戶原來的session ,重新創(chuàng)建了一個(gè)session,于是有3個(gè)session了,但是瀏覽器只有2個(gè),也就是模擬應(yīng)該是只有2個(gè)人在線上。 

有2個(gè)方法可以解決這個(gè)問題,一個(gè)是在關(guān)閉網(wǎng)頁(yè)的時(shí)候,前端去調(diào)用一個(gè)方法把session銷毀。另一個(gè)更好的方法是,讓服務(wù)器記得原來那個(gè)session,即把原來的sessionId 記錄在瀏覽器,下次打開時(shí),把這個(gè)sessionId發(fā)送過去,這樣服務(wù)器就不會(huì)重新創(chuàng)建。

代碼修改如下:

@Controller 
public class IndexController { 
  @RequestMapping("/count") 
  @ResponseBody 
  public String number(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse){ 
    try{ //把sessionId記錄在瀏覽器 
      Cookie c = new Cookie("JSESSIONID", URLEncoder.encode(httpServletRequest.getSession().getId(), "utf-8")); 
      c.setPath("/"); 
      //先設(shè)置cookie有效期為2天,不用擔(dān)心,session不會(huì)保存2天 
      c.setMaxAge( 48*60 * 60); 
      httpServletResponse.addCookie(c); 
    }catch (Exception e){ 
      e.printStackTrace(); 
    } 
    HttpSession session = httpServletRequest.getSession(); 
    Object count=session.getServletContext().getAttribute("count"); 
    return "count : "+count; 
  } 
} 

總結(jié)

以上所述是小編給大家介紹的springboot 用監(jiān)聽器統(tǒng)計(jì)在線人數(shù)案例分析,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Springboot下使用Redis管道(pipeline)進(jìn)行批量操作

    Springboot下使用Redis管道(pipeline)進(jìn)行批量操作

    本文主要介紹了Spring?boot?下使用Redis管道(pipeline)進(jìn)行批量操作,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • 如何基于sqlite實(shí)現(xiàn)kafka延時(shí)消息詳解

    如何基于sqlite實(shí)現(xiàn)kafka延時(shí)消息詳解

    這篇文章主要給大家介紹了關(guān)于如何基于sqlite實(shí)現(xiàn)kafka延時(shí)消息的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-01-01
  • Java中逆序遍歷List集合的實(shí)現(xiàn)

    Java中逆序遍歷List集合的實(shí)現(xiàn)

    本文主要介紹了Java中逆序遍歷List集合的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • 詳談java中int和Integer的區(qū)別及自動(dòng)裝箱和自動(dòng)拆箱

    詳談java中int和Integer的區(qū)別及自動(dòng)裝箱和自動(dòng)拆箱

    這篇文章主要介紹了詳談java中int和Integer的區(qū)別及自動(dòng)裝箱和自動(dòng)拆箱,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 搭建maven私有倉(cāng)庫(kù)的方法實(shí)現(xiàn)

    搭建maven私有倉(cāng)庫(kù)的方法實(shí)現(xiàn)

    Maven是一個(gè)流行的Java項(xiàng)目管理工具,它可以幫助我們管理項(xiàng)目的構(gòu)建、報(bào)告和文檔,本文主要介紹了搭建maven私有倉(cāng)庫(kù)的方法實(shí)現(xiàn),感興趣的可以了解一下
    2023-05-05
  • try-with-resource優(yōu)雅關(guān)閉io流的方法

    try-with-resource優(yōu)雅關(guān)閉io流的方法

    這篇文章主要給大家介紹了關(guān)于try-with-resource優(yōu)雅關(guān)閉io流的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Java實(shí)現(xiàn)獲取客戶端真實(shí)IP方法小結(jié)

    Java實(shí)現(xiàn)獲取客戶端真實(shí)IP方法小結(jié)

    本文給大家匯總介紹了2種使用java實(shí)現(xiàn)獲取客戶端真實(shí)IP的方法,主要用于獲取使用了代理訪問的來訪者的IP,有需要的小伙伴可以參考下。
    2016-03-03
  • Java 內(nèi)部類的定義與范例

    Java 內(nèi)部類的定義與范例

    說起內(nèi)部類這個(gè)詞,想必很多人都不陌生,但是又會(huì)覺得不熟悉。原因是平時(shí)編寫代碼時(shí)可能用到的場(chǎng)景不多,用得最多的是在有事件監(jiān)聽的情況下,并且即使用到也很少去總結(jié)內(nèi)部類的用法。今天我們就來一探究竟
    2021-11-11
  • Java的SpringMVC中控制器返回XML數(shù)據(jù)問題

    Java的SpringMVC中控制器返回XML數(shù)據(jù)問題

    這篇文章主要介紹了Java的SpringMVC中控制器返回XML數(shù)據(jù)問題,控制器是處理HTTP請(qǐng)求的組件,它們接收來自客戶端的請(qǐng)求,并將其轉(zhuǎn)換為適當(dāng)?shù)捻憫?yīng),這些響應(yīng)可以是動(dòng)態(tài)生成的?HTML?頁(yè)面,也可以是JSON或XML格式的數(shù)據(jù),需要的朋友可以參考下
    2023-07-07
  • springboot使用jasypt加密庫(kù)實(shí)現(xiàn)數(shù)據(jù)庫(kù)加解密示例代碼

    springboot使用jasypt加密庫(kù)實(shí)現(xiàn)數(shù)據(jù)庫(kù)加解密示例代碼

    這篇文章主要給大家介紹了關(guān)于springboot使用jasypt加密庫(kù)實(shí)現(xiàn)數(shù)據(jù)庫(kù)加解密的相關(guān)資料,Jasypt是一個(gè)用于配置文件加密的Java庫(kù),它可以用來加密和解密配置文件中的敏感信息,如數(shù)據(jù)庫(kù)密碼、API?密鑰等,需要的朋友可以參考下
    2024-04-04

最新評(píng)論

高密市| 新平| 雷州市| 都安| 邳州市| 乐安县| 韶关市| 搜索| 石泉县| 泾川县| 陵水| 延吉市| 县级市| 金阳县| 祁东县| 宜丰县| 南溪县| 辛集市| 固镇县| 博湖县| 平塘县| 务川| 新津县| 桓台县| 浦北县| 永仁县| 长乐市| 鄂尔多斯市| 昌邑市| 建瓯市| 永康市| 大悟县| 临夏县| 乌海市| 德安县| 当雄县| 石棉县| 汝阳县| 崇仁县| 温宿县| 吐鲁番市|