ในบทความนี้โครงการใน Springboot ใช้ผู้ฟัง HttpsessionListener (หนึ่งในผู้ฟัง) เพื่อนับจำนวนผู้คนออนไลน์ซึ่งเป็นหลักที่จะนับจำนวนเซสชัน
ความคิดนั้นง่ายมาก แต่มีรายละเอียดที่ฉันไม่ได้จัดการดังนั้นฉันจึงทำการดีบักมากกว่าหนึ่งวันก่อนที่ฉันจะทำข้อผิดพลาด
ก่อนอื่นเขียนผู้ฟัง httpsessionListener นับคือจำนวนเซสชัน (จำนวนคน) เมื่อเซสชันถูกสร้างขึ้นวิธีการเซสชันของผู้ฟังจะถูกเรียกใช้ เมื่อเซสชันถูกทำลายวิธีการที่ถูกทำลายของผู้ฟังจะถูกเรียกใช้ หลังจากคำนวณจำนวนคนในผู้ฟังแล้วให้ใส่ลงใน ServletContext (สามารถเข้าใจได้ว่าเป็นที่เก็บข้อมูลที่คำขอใด ๆ สามารถจัดเก็บและรับคุณสมบัติภายใน)
ให้ความสนใจกับการเพิ่ม @WebListener ให้กับผู้ฟังดังนั้นจึงไม่จำเป็นต้องกำหนดค่า
@WebListener คลาสสาธารณะ OnLineCount ใช้ httpsessionListener {public int count = 0; // บันทึกจำนวนของเซสชัน // ฟังการสร้างเซสชัน, การรวมกันของการเพิ่มขึ้นของ void sessioncreated (httpsessionevent arg0) นับ ++; arg0.getSession (). getServletContext (). setAttribute ("count" นับ); } @Override สาธารณะที่ซิงโครไนซ์เป็นโมฆะเซสชัน destroyed (httpsessionEvent arg0) {// ซ้ำระบบการเพิกถอนเซสชันของเซสชัน. out.println ("【 httpsessionListener ผู้ฟัง】นับ- ลด"); นับ--; arg0.getSession (). getServletContext (). setAttribute ("count" นับ); -จากนั้นเขียนคอนโทรลเลอร์ที่สอบถามจำนวนเซสชัน ฉันเริ่มต้นด้วยสิ่งต่อไปนี้ซึ่งผิด!
นับจาก ServletContext และนับกลับไปที่ส่วนหน้า
@RequestMapping ("/count") @ResponseBody จำนวนสตริงสาธารณะ (httpservletRequest httpservletRequest, httpservletResponse httpservletResponse) {จำนวนวัตถุ = httpservletRequest.getServletContext () กลับ "นับ:"+นับ; -นี่เป็นสิ่งที่ผิด คุณจะพบว่าหน้าเว็บเห็นว่าการนับเป็นโมฆะเนื่องจากไม่มีการสร้างเซสชันและไม่มีวิธีการทางสถิติในการเรียกผู้ฟัง ดังนั้นเปลี่ยนมัน:
@Controller คลาสสาธารณะ INDEXCONTROLLER {@RequestMapping ("/count") @ResponseBody จำนวนสตริงสาธารณะ (httpservletRequest httpservletrequest, httpservleSserSservesponse httpservletResponse) จำนวนวัตถุ = เซสชัน. getServletContext (). getAttribute ("count"); กลับ "นับ:"+นับ; - httpsession session = httpservletrequest.getSession (); ฟังก์ชั่น: หากผู้ใช้ไม่มีเซสชันเขาจะสร้างเซสชันและหากมีเซสชันเขาจะไม่สร้างมันขึ้นมา
ดูเหมือนว่าจะเปลี่ยนเป็นการทดสอบนี้ แต่มีปัญหา เบราว์เซอร์สอดคล้องกับเซสชัน หากคุณเปิดเบราว์เซอร์ 2 ตัวคุณจะเห็นว่าจำนวนนั้นคือ 2 ซึ่งถูกต้อง แต่ถ้าคุณปิดเบราว์เซอร์และเปิดมันควรเป็น 2 และยังคงไม่เปลี่ยนแปลง แต่มันกลายเป็น 3 เหตุผลก็คือวิธีการทำลายเซสชันไม่ได้ดำเนินการ เมื่อคุณเปิดใหม่เซิร์ฟเวอร์ไม่สามารถค้นหาเซสชันดั้งเดิมของผู้ใช้และสร้างเซสชันใหม่ ดังนั้นจึงมี 3 เซสชัน แต่มีเพียง 2 เบราว์เซอร์ซึ่งหมายความว่าควรมีเพียง 2 คนออนไลน์ในการจำลอง
มีสองวิธีในการแก้ปัญหานี้ หนึ่งคือเรียกวิธีการทำลายเซสชันเมื่อปิดหน้าเว็บ อีกวิธีที่ดีกว่าคือให้เซิร์ฟเวอร์จดจำเซสชันดั้งเดิมนั่นคือบันทึกเซสชันดั้งเดิมในเบราว์เซอร์และส่งเซสชัน ID ในครั้งต่อไปที่คุณเปิดเพื่อให้เซิร์ฟเวอร์จะไม่สร้างใหม่
รหัสได้รับการแก้ไขดังนี้:
@controller คลาสสาธารณะ Class IndexController {@requestmapping ("/count") @ResponseBody หมายเลขสตริงสาธารณะ (httpservletRequest httpservletrequest, httpservleSserSesponse httpservletResponse) {ลอง {// บันทึกเซสชัน urlencoder.encode (httpservletrequest.getSession (). getId (), "UTF-8")); C.SetPath ("/"); // ตั้งค่าระยะเวลาความถูกต้องของคุกกี้ก่อน 2 วันไม่ต้องกังวลเซสชั่นจะไม่ถูกบันทึกเป็นเวลา 2 วัน c.setMaxage (48 * 60 * 60); httpservletresponse.addcookie (c); } catch (exception e) {e.printstacktrace (); } httpsession session = httpservletrequest.getSession (); จำนวนวัตถุ = เซสชัน. getServletContext (). getAttribute ("count"); กลับ "นับ:"+นับ; -สรุป
ข้างต้นคือการวิเคราะห์กรณีของ Springboot โดยใช้มอนิเตอร์เพื่อนับผู้ใช้ออนไลน์ที่แนะนำโดยบรรณาธิการ ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับทุกคนในเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!