Dalam artikel ini, proyek di Springboot menggunakan pendengar HttpsessionListener (salah satu pendengar) untuk menghitung jumlah orang secara online, yang pada dasarnya menghitung jumlah sesi.
Idenya sangat sederhana, tetapi ada detail yang tidak saya tangani, jadi saya men -debug itu lebih dari sehari sebelum saya menyelesaikan bug.
Pertama -tama tulis pendengar httpsessionlistener. Hitungan adalah jumlah sesi (jumlah orang). Ketika sesi dibuat, metode sessioncreated dari pendengar akan dipicu. Ketika sesi dihancurkan, metode sesi yang membuat pendengar akan dipicu. Setelah menghitung jumlah orang di pendengar, masukkan ke dalam servletContext (dapat dipahami sebagai repositori di mana permintaan apa pun dapat menyimpan dan mendapatkan properti di dalamnya).
Perhatikan menambahkan @WebListener ke pendengar, jadi tidak perlu mengkonfigurasinya.
@Weblistener kelas publik Onlinecount mengimplementasikan httpsessionlistener {public int count = 0; // Rekam jumlah sesi // dengarkan penciptaan sesi, disinkronkan anti-konkron bug publik yang disinkronkan public Sesion) (httpsession {system.out.println ("【nountpession {{System.out.println (" 【【{httpsession {oMerPies {" Count ++; arg0.getSession (). getServletContext (). setAttribute ("count", count); } @Override public disinkronkan void sessionDestroyed (httpsessionEvent arg0) {// Repeat Sesi Revocation System.out.println ("【HttpsessionListener Listener】 Count-- redukir"); menghitung--; arg0.getSession (). getServletContext (). setAttribute ("count", count); }}Kemudian tulis controller yang menanyakan jumlah sesi. Saya mulai dengan yang berikut, yang salah!
Ambil hitungan dari servletContext dan return count ke ujung depan.
@RequestMapping ("/count") @ResponseBody public string count (httpservletRequest httpservletRequest, httpservletResponse httpservletResponste) {getTribute = httpservletRe. return "count:"+count; }Ini salah. Anda akan menemukan bahwa halaman melihat bahwa penghitungan adalah nol karena tidak ada sesi yang dibuat, dan tidak ada metode statistik untuk memicu pendengar. Jadi ubahlah:
@Controller Public Class IndexController {@RequestMapping ("/count") @ResponseBody Public String Count (httpservletRequest httpservletRequest, httpservletResponse httpservletesponse (httpsession = httpservetSession (httpsession = httpservetsession (httpsession = httpservetSession (httpsession = httpservetsession) {httpsession = httpservetsession (httpsession; Object count = session.getSerVletContext (). GetAttribute ("count"); return "count:"+count; }} Httpsession sesi = httpservletRequest.getSession (); Fungsi: Jika pengguna tidak memiliki sesi, ia akan membuat sesi, dan jika ada sesi, ia tidak akan membuatnya.
Tampaknya benar untuk mengubahnya pada tes ini, tetapi ada masalah. Browser sesuai dengan sesi. Jika Anda membuka 2 browser, Anda akan melihat bahwa jumlah adalah 2, yang benar. Tetapi jika Anda menutup browser dan membukanya, itu harus 2 dan tetap tidak berubah, tetapi menjadi 3. Alasannya adalah bahwa metode penghancuran sesi tidak dieksekusi. Saat Anda dibuka kembali, server tidak dapat menemukan sesi asli pengguna dan menciptakan kembali sesi. Jadi ada 3 sesi, tetapi hanya ada 2 browser, yang berarti bahwa hanya ada 2 orang online dalam simulasi.
Ada dua cara untuk menyelesaikan masalah ini. Salah satunya adalah memanggil metode untuk menghancurkan sesi saat menutup halaman web. Cara lain yang lebih baik adalah membiarkan server mengingat sesi asli, yaitu, merekam sesi asli di browser, dan mengirim sessionID lain kali Anda membukanya, sehingga server tidak akan membuatnya kembali.
Kode dimodifikasi sebagai berikut:
@Controller Public Class IndexController {@RequestMapping ("/count") @ResponseBody Public String Number (httpservletRequest httpservletRequest, httpservletResponse httpservletResponse) {try {// record sessionid di browser cookie c = cookie ("jewsespons) {try {// record cookie di browser c =" cookie corEDEDE "," cookie cookie cookie coreDeD "," cookie cookie cookie cookie coreDe (" Urlencoder.encode (httpservletrequest.getSession (). GetId (), "UTF-8"))); c.setpath ("/"); // Atur periode validitas cookie terlebih dahulu hingga 2 hari, jangan khawatir, sesi tidak akan disimpan selama 2 hari c.setmaxage (48 * 60 * 60); httpservletResponse.addcookie (c); } catch (Exception e) {E.PrintStackTrace (); } Httpsession sesi = httpservletRequest.getSession (); Object count = session.getSerVletContext (). GetAttribute ("count"); return "count:"+count; }}Meringkaskan
Di atas adalah analisis kasus springboot menggunakan monitor untuk menghitung pengguna online yang diperkenalkan oleh editor. Saya harap ini akan membantu semua orang. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan dan editor akan membalas semua orang tepat waktu. Terima kasih banyak atas dukungan Anda ke situs web Wulin.com!