springboot 用監聽器統計在線人數案例分析


創建HttpSessionListener 監聽器

先寫個HttpSessionListener 監聽器。count 是session的數量(人數),session 創建的時候,會觸發監聽器的sessionCreated 方法,session銷毀的時候,會觸發監聽器的sessionDestroyed 方法。 在監聽器中計算完人數count,把他放進servletContext(可以理解為一個倉庫,任意請求可以存儲和獲取里面的屬性)

/**
 * @author fanghui
 */
@SpringBootApplication
@MapperScan({"com.izkml.energy.data.mapper"})
@EnableSwagger2
@EnableAsync
@EnableCaching
@ServletComponentScan //添加這個注解
public class EnergyDataApplication {
    public static void main(String[] args) {
        SpringApplication.run(EnergyDataApplication.class, args);
    }

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**")
                        .allowCredentials(true)
                        .allowedOrigins("*")
                        .allowedMethods("GET", "POST");
            }
        };
    }
}

controller編碼

接着寫一個查詢session 數量的controller,我開始的時候是像下面這樣寫的,是錯誤的!
從servletContext 中取出count ,把count返回前端

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

這樣是錯誤的,測試你會發現,頁面看到count 是null ,因為沒有創建session,沒有觸發監聽器的統計方法。於是改一下:


@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則創建session ,有則取得session不創建。

改成這樣測試,看起來是對的,但是有個問題。一個瀏覽器對應一個session,你打開2個瀏覽器,看到count是2 ,是對的。但是你關了一個瀏覽器,再打開,應該是2不變才對,但是變成3 了,原因是session銷毀的方法沒有執行,重新打開時,服務器找不到用戶原來的session ,重新創建了一個session,於是有3個session了,但是瀏覽器只有2個,也就是模擬應該是只有2個人在線上。
有2個方法可以解決這個問題,一個是在關閉網頁的時候,前端去調用一個方法把session銷毀。另一個更好的方法是,讓服務器記得原來那個session,即把原來的sessionId 記錄在瀏覽器,下次打開時,把這個sessionId發送過去,這樣服務器就不會重新創建。

代碼修改如下:


@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("/");
            //先設置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;
    }
}

總結:這里只是一個小小的案例分析,后續還會結合不同應用業務場景來進行應用,大家可以在評論區進行評論,動一動你們的鼠標可以關注下,博文會持續分享一些干貨


免責聲明!

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



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