แนวคิดการใช้งานของ Javaweb ที่สามารถเข้าสู่ระบบได้ในที่เดียวในเวลาเดียวกัน (คล้ายกับฟังก์ชั่นการเข้าสู่ระบบ QQ) มีดังนี้:
1. ฟังก์ชั่นของฟังก์ชั่นนี้คืออะไร?
ทุกคนคิดเกี่ยวกับมัน อย่างไรก็ตามจะมีความต้องการเช่นนี้เสมอ วันนี้จะไม่มีความต้องการ - ฮิฮิ บางครั้งมันอาจไม่ใช่ข้อกำหนดและมีแนวโน้มว่ามันจะทำเช่นนั้นเพื่อความปลอดภัย ตัวอย่างเช่นระบบการสอบและระบบแชทออนไลน์จำเป็นต้องทำเช่นนี้
2. กระบวนการดำเนินการ
. การวิเคราะห์ปัญหา
ในระบบเรามักจะผูกข้อมูลการเข้าสู่ระบบกับเซสชัน ดูเหมือนว่าการเริ่มต้นจากสิ่งนี้เป็นไปได้ที่จะหาวิธีแก้ปัญหา หากต้องการนำไปใช้อย่างตรงไปตรงมาเมื่อผู้ใช้เข้าสู่ระบบพิจารณาว่าผู้ใช้เข้าสู่ระบบหรือไม่หากเขาเข้าสู่ระบบมันจะโอเคที่จะล้างเซสชันก่อนหน้า - ดูเหมือนง่ายมากใช่มั้ย ในความเป็นจริงถ้าคุณคิดอย่างรอบคอบคุณจะพบปัญหาต่อไปนี้: จะทำให้ผู้ใช้ได้ลงชื่อเข้าใช้ก่อนหน้านี้นั่นคือวิธีการเข้าถึงข้อมูลเซสชันที่เข้าสู่ระบบทั้งหมดได้อย่างไร
ข. การใช้งานเฉพาะ
อย่างที่เราทุกคนรู้ดูเหมือนว่าจะไม่มีวิธีเฉพาะที่จะได้รับข้อมูลเซสชันทั้งหมดโดยตรงใน J2EE API แต่เราสามารถตรวจสอบกระบวนการสร้างและทำลายเซสชันทั้งหมดโดยการกำหนดค่าผู้ฟังรวมถึงตรวจสอบการสร้างการลบและกระบวนการทดแทนของแอตทริบิวต์ในเซสชัน
อันที่จริงเราแค่ต้องทำสิ่งต่อไปนี้:
เมื่อบันทึกข้อมูลการเข้าสู่ระบบของผู้ใช้เป็นเซสชันเซสชันที่เกี่ยวข้องเป็นกระบวนการที่รวมอยู่ในการสร้างแอตทริบิวต์ซึ่งสามารถบันทึกเซสชันปัจจุบันลงใน ArrayList
ในความเป็นจริงเมื่อบันทึกลงในรายการคุณต้องสำรวจก่อนว่ามีข้อมูลการเข้าสู่ระบบของผู้ใช้อยู่แล้วในรายการนี้หรือไม่ หากมีอยู่ให้ทำลายข้อมูลเซสชันที่มีอยู่ในรายการนี้และลบออกจากรายการ หากไม่มีอยู่ให้ใส่ข้อมูลเซสชันลงในรายการ
เมื่อข้อมูลการเข้าสู่ระบบของเซสชันถูกทำลายให้ลบเซสชันออกจากรายการโดยตรง
นอกจากนี้เมื่อผู้ใช้เข้าสู่ระบบโดยไม่ต้องเข้าสู่ระบบและบันทึกโดยตรงนี่เป็นกระบวนการของการเปลี่ยนแอตทริบิวต์เซสชัน นอกจากนี้ยังจำเป็นต้องพิจารณาว่าผู้ใช้ใหม่มีอยู่แล้วในเซสชันอื่นนอกเหนือจากเซสชันปัจจุบันหรือไม่ ถ้ามีอยู่ให้ลบออก
รหัสเฉพาะมีดังนี้:
แพ็คเกจ com.weirhp; นำเข้า java.util.arraylist; นำเข้า java.util.collections; นำเข้า java.util.list; นำเข้า javax.servlet.http.httpsession; นำเข้า javax.servlet.http.httpsessionattributelistener; javax.servlet.http.httpsessionEvent; นำเข้า Javax.servlet.http.httpsessionListener; บันทึกระดับสาธารณะ recordsessionListener ใช้ httpsessionattributelistener, httpsessionListener (เซสชั่น == null) {sessions = collections.ynchronizedList (arraylist ใหม่ <เซสชันและเซสเซอร์> ());}} โมฆะสาธารณะ attributedded (httpsessionbindingevent e) {httpsession session = e.getSession (); e.getName (); // 登录 if (attrName.equals (loginFlag)) {ผู้ใช้ nowuser = (ผู้ใช้) e.getValue (); ผู้ใช้ suser = (ผู้ใช้) เซสชัน. getAttribute (loginFlag); (tem.getUserId (). เท่ากับ (nowuser.getName ())) {tem.getSession (). unvalidate (); // โทรออกโดยอัตโนมัติ removeBreak;}} sessionanduser SAU = ใหม่ sessionanduser (); sau.setUserId (nowuser.getName ()); sau.setsession (เซสชัน); sau.setsid (session.getId ()); sessions.add (SAU);}} โมฆะสาธารณะ e.getSession (); System.out.println ("-------------*เริ่มลบ*-------------------"); string attrName = e.getName (); // 登录ถ้า (attrName.equals (loginFlag)) {ผู้ใช้ NowUser = (ผู้ใช้) e.getValue () i> = 0; i--) {sessionanduser tem = sessions.get (i); ถ้า (tem.getUserId (). เท่ากับ (NowUser.getName ())) {เซสชัน remove (i); break;}}}} โมฆะสาธารณะ e.getSession (); System.out.println ("-------------*เริ่มแทนที่*-----------------------"); string attrName = e.getName (); int dels = -1; // 登录ถ้า attrName.equals (logginFlag)) (ผู้ใช้) session.getAttribute (loginflag); // ผู้ใช้ในเซสชันปัจจุบัน // Traverses ทั้งหมด sessionfor (int i = sessions.size ()-1; i> = 0; i--) {sessionanduser tem = sessions.get (i); (tem.getUserId (). เท่ากับ (nowuser.getName ()) &&! if (tem.getSid (). เท่ากับ (session.getId ())) {tem.setUserId (nowuser.getName ());}} ถ้า (dels! =-1) {sessions.get (dels) .getSession () นอกจากนี้ยังจะถูกลบออกจากเซสชัน}}} โมฆะสาธารณะเซสชัน SessionCreated (httpsessionEvent E) {} โมฆะสาธารณะเซสชั่นเซสชั่น (httpsessionEvent E) {}}สูตรใน web.xml
<Sistener> <Display-Name> RecordSession </display-Name> <Sistener-Lass> com.weirhp.recordsessionListener </listener-class> </listener>
3. ปัญหาที่เป็นไปได้
อาจมีบางสิ่งที่โปรแกรมทั้งหมดไม่คาดหวัง อาจมีข้อบกพร่องบางอย่างและคุณต้องระมัดระวังเมื่อใช้ในโครงการเฉพาะ ทุกคนยินดีที่จะสร้างภาพและหวังว่าจะให้คำแนะนำ ฉันจะปรับปรุงอีกครั้ง
4. ความคิดบางอย่างในภายหลัง
หากเครื่องทั้งสองใช้บัญชีเดียวกันเพื่อเข้าสู่ระบบในเวลาเดียวกันบัญชีทั้งสองสามารถเข้าสู่ระบบได้สำเร็จหรือไม่? - (เช่นกันเมื่อรายการเซสชันนี้มีขนาดใหญ่มากเครื่องสองเครื่องอาจเข้าสู่ระบบได้สำเร็จเมื่อเข้าสู่ระบบในระบบโดยใช้บัญชีเดียวกันในเวลาเดียวกันในช่วงระยะเวลาการเดินทาง) เข้าไปพัวพันมาก - ควรควบคุมได้อย่างไร?
(วิธีแก้ปัญหา: หลังจากการทดสอบผู้ฟังเป็นซิงเกิลในระบบการเพิ่มคำหลักที่ซิงโครไนซ์ลงในวิธีการของมันสามารถมั่นใจได้ถึงความปลอดภัยของเธรดของรายการ)
ด้านบนเป็น Javaweb ที่แนะนำให้คุณทราบว่าตัวแก้ไขสามารถเข้าสู่ระบบได้ในที่เดียวในเวลาเดียวกัน (คล้ายกับฟังก์ชั่นการเข้าสู่ระบบ QQ) ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับทุกคนในเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!