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

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

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

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

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

 先寫個HttpSessionListener 監(jiān)聽器。count  是session的數(shù)量(人數(shù)),session 創(chuàng)建的時候,會觸發(fā)監(jiān)聽器的sessionCreated 方法,session銷毀的時候,會觸發(fā)監(jiān)聽器的sessionDestroyed 方法。 在監(jiān)聽器中計算完人數(shù)count,把他放進servletContext(可以理解為一個倉庫,任意請求可以存儲和獲取里面的屬性)。
 注意監(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); 
  } 
} 

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

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

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

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

@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)建。

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

有2個方法可以解決這個問題,一個是在關(guān)閉網(wǎng)頁的時候,前端去調(diào)用一個方法把session銷毀。另一個更好的方法是,讓服務器記得原來那個session,即把原來的sessionId 記錄在瀏覽器,下次打開時,把這個sessionId發(fā)送過去,這樣服務器就不會重新創(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天,不用擔心,session不會保存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)計在線人數(shù)案例分析,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

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

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

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

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

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

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

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

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

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

    搭建maven私有倉庫的方法實現(xiàn)

    Maven是一個流行的Java項目管理工具,它可以幫助我們管理項目的構(gòu)建、報告和文檔,本文主要介紹了搭建maven私有倉庫的方法實現(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)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • Java實現(xiàn)獲取客戶端真實IP方法小結(jié)

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

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

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

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

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

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

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

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

最新評論

筠连县| 巩义市| 宣威市| 滁州市| 昌吉市| 晋州市| 清丰县| 年辖:市辖区| 莲花县| 黄大仙区| 延安市| 汾西县| 甘洛县| 德昌县| 平潭县| 金门县| 湾仔区| 察隅县| 萨嘎县| 蓬莱市| 米脂县| 陇南市| 五指山市| 永吉县| 本溪| 富宁县| 虹口区| 特克斯县| 买车| 鹤山市| 修水县| 宁城县| 石河子市| 康定县| 囊谦县| 昭平县| 上杭县| 敖汉旗| 溧阳市| 弋阳县| 嘉鱼县|