ในฐานะดาวรุ่งพุ่งแรง JSP สามารถดำรงตำแหน่งบางอย่างในสภาพแวดล้อมการเขียนโปรแกรมเซิร์ฟเวอร์ ซึ่งเกี่ยวข้องอย่างใกล้ชิดกับการสนับสนุนที่ดีสำหรับมาตรฐานอุตสาหกรรมต่างๆ เซสชันเป็นหนึ่งในโครงสร้างพื้นฐานที่มีให้ ในฐานะโปรแกรมเมอร์ คุณสามารถใช้การจัดการผู้ใช้ตามเซสชันง่ายๆ ได้อย่างง่ายดาย โดยไม่ต้องกังวลเกี่ยวกับวิธีการใช้งานบนไคลเอนต์ มีวิธีต่างๆ สองสามวิธีในการจัดการกับผู้ใช้ออนไลน์ในปัจจุบัน
หนึ่งคือผู้ใช้จะควบคุมการรีเฟรชหน้า และเซิร์ฟเวอร์จะควบคุมการหมดเวลา เช่น 30 นาที หลังจากหมดเวลา ผู้ใช้จะถูกไล่ออกหากไม่มีการดำเนินการใดๆ ข้อดีของวิธีนี้คือหากผู้ใช้ลืมออกจากระบบ จะสามารถป้องกันไม่ให้ผู้อื่นดำเนินการที่เป็นอันตรายได้ ข้อเสียคือหากคุณกำลังทำอะไรบางอย่างที่ใช้เวลานานและเกินเวลาที่กำหนด คุณอาจต้องเข้าสู่ระบบอีกครั้งเมื่อส่ง หากพื้นผิวใบเดิมถูกบังคับให้ล้มเหลวอีกครั้ง คุณอาจสูญเสียงานที่คุณทำไปแล้ว จากมุมมองของการใช้งาน นี่เป็นวิธีที่ง่ายที่สุด และฝั่งเซิร์ฟเวอร์จะใช้โหมดนี้ตามค่าเริ่มต้น
อีกวิธีหนึ่งคือไซต์ใช้โครงสร้างเฟรม และมีเฟรมหรือ iframe ที่ซ่อนอยู่ซึ่งรีเฟรชอยู่ตลอดเวลา เพื่อที่คุณจะไม่ถูกไล่ออก อย่างไรก็ตาม ในการพิจารณาว่าคุณออนไลน์อยู่หรือไม่ เซิร์ฟเวอร์จำเป็นต้องตั้งค่า หากคุณเกินเวลางุนงงนี้ หากคุณไม่รีเฟรชเพจอื่น ยกเว้นเพจที่รีเฟรชอัตโนมัติ จะถือว่าคุณไม่ได้ออนไลน์อีกต่อไป ตัวอย่างทั่วไปของแนวทางนี้คือ xici.net ข้อได้เปรียบของมันคือสามารถใช้การรีเฟรชอย่างต่อเนื่องเพื่อใช้ฟังก์ชันบางอย่างที่คล้ายกับการพุชเซิร์ฟเวอร์ เช่น การส่งข้อความระหว่างชาวเน็ต
ไม่ว่าจะใช้โหมดใดก็ตาม จำเป็นต้องทำงานเพิ่มเติมบางอย่างเพื่อที่จะเรียกดูผู้ใช้ที่ออนไลน์อยู่ทั้งหมดในปัจจุบัน ไม่มี API ที่จะรับรายการเซสชันใน Servlet API
สิ่งที่สามารถใช้ได้คือ Listener ข้อกำหนดของ Servlet 2.2 และ 2.3 แตกต่างกันเล็กน้อยที่นี่ HttpSessionBindingListener ใน 2.2 สามารถใช้คลาสที่แจ้งให้คุณทราบเมื่อแอตทริบิวต์ใน HTTPSession เปลี่ยนแปลง
HttpSessionAttributeListener เปิดตัวใน 2.3 ด้วย เนื่องจากสภาพแวดล้อมที่ฉันใช้คือ Visual age สำหรับ Java 4 และ JRun server 3.1 พวกเขาจึง
ไม่รองรับการเขียนโปรแกรม Servlet 2.3 โดยตรง ที่นี่ฉันใช้ HttpSessionBindingListener
ใช้อินเทอร์เฟซ HttpSessionBindingListener อินเทอร์เฟซนี้มีสองวิธี:
public void valueBound(HttpSessionBindingEvent event)
public void valueUnbound(HttpSessionBindingEvent event)
เมื่อคุณรัน Session.addAttribute(String,Object) หากคุณได้เพิ่มคลาสที่ใช้อินเทอร์เฟซ HttpSessionBindingListener เป็น Attribute เซสชันจะแจ้งให้ทราบ ชั้นเรียนของคุณและเรียกเมธอด valueBound ของคุณ ในทางตรงกันข้าม เมธอด Session.removeAttribute จะสอดคล้องกับเมธอด valueUndound
HttpSessionBinding คลาสสาธารณะใช้ javax.servlet.http.HttpSessionBindingListener
-
แอปพลิเคชัน ServletContext = null;
HttpSessionBinding สาธารณะ (แอปพลิเคชัน ServletContext)
-
ซุปเปอร์();
ถ้า (แอปพลิเคชัน == null)
โยน IllegalArgumentException ใหม่ ("แอปพลิเคชัน Null ไม่ยอมรับ");
this.application = แอปพลิเคชัน;
-
โมฆะสาธารณะ valueBound (javax.servlet.http.HttpSessionBindingEvent e)
-
เวกเตอร์ activeSessions = (เวกเตอร์) application.getAttribute("activeSessions");
ถ้า (activeSessions == null)
-
activeSessions = เวกเตอร์ใหม่ ();
-
JDBCUser sessionUser = (JDBCUser)e.getSession().getAttribute("ผู้ใช้");
ถ้า (ผู้ใช้เซสชัน != null)
-
activeSessions.add(e.getSession());
-
application.setAttribute("activeSessions",activeSessions);
-
โมฆะสาธารณะ valueUnbound (javax.servlet.http.HttpSessionBindingEvent e)
-
JDBCUser sessionUser = (JDBCUser)e.getSession().getAttribute("ผู้ใช้");
ถ้า (ผู้ใช้เซสชัน == null)
-
เวกเตอร์ activeSessions = (เวกเตอร์) application.getAttribute("activeSessions");
ถ้า (activeSessions != null)
-
activeSessions.remove(e.getSession().getId());
application.setAttribute("activeSessions",activeSessions);
-
-
-
- |
สมมติว่าคลาส JDBCUser เป็นคลาส User ที่กำหนดเอง เมื่อดำเนินการเข้าสู่ระบบของผู้ใช้ ให้เพิ่มทั้งคลาส User และคลาส HttpSessionBinding ให้กับเซสชัน
ด้วยวิธีนี้ ทุกครั้งที่ผู้ใช้เข้าสู่ระบบ บันทึกจะถูกเพิ่มให้กับเวกเตอร์แอตทริบิวต์ "activeSessions" ในแอปพลิเคชัน เมื่อใดก็ตามที่เซสชันหมดเวลา valueUnbound จะถูกทริกเกอร์ และเซสชันที่กำลังจะหมดเวลาจะถูกลบออกจากเวกเตอร์นี้
การเข้าสู่ระบบโมฆะสาธารณะ ()
พ่น ACLException, SQLException, IOException
-
/* รับคลาสผู้ใช้ JDBC */
ถ้า (ผู้ใช้ != null)
-
ออกจากระบบ();
-
-
// หากเซสชันหมดเวลาหรือผู้ใช้ไม่ได้เข้าสู่ระบบ ให้บันทึก URL เป้าหมายไว้ชั่วคราว
JDBCUserFactory uf = JDBCUserFactory ใหม่ ();
ถ้า ( (this.request.getParameter("userID")==null) || (this.request.getParameter("password")==null) )
-
โยน ACLException ใหม่ ("กรุณากรอกชื่อผู้ใช้และรหัสผ่านที่ถูกต้อง");
-
ผู้ใช้ JDBCUser = (JDBCUser) uf.UserLogin(
this.request.getParameter("รหัสผู้ใช้"),
this.request.getParameter("รหัสผ่าน") );
user.touchLoginTime();
this.session.setAttribute("ผู้ใช้",ผู้ใช้);
this.session.setAttribute("BindingNotify",HttpSessionBinding ใหม่ (แอปพลิเคชัน));
-
- |
เมื่อเข้าสู่ระบบ ให้เพิ่มผู้ใช้และคลาสวัตถุประสงค์ BindingNotofy ให้กับเซสชัน เมื่อออกจากระบบ คุณต้องลบเซสชันในเวกเตอร์ activeSessions ทันที |
|
ฟังก์ชันทั้งสองนี้อยู่ในคลาส HttpSessionManager คลาสนี้อ้างถึงแอปพลิเคชันโกลบอลอ็อบเจ็กต์ใน jsp โค้ดอื่นของคลาสนี้ไม่เกี่ยวข้องกับบทความนี้และค่อนข้างยาว ดังนั้นฉันจะไม่โพสต์มัน มาดูวิธีการใช้งานใน JSP กันดีกว่า สมมติว่าแบบฟอร์มเข้าสู่ระบบถูกส่งไปยัง doLogin.jsp และแบบฟอร์มประกอบด้วยฟิลด์ชื่อผู้ใช้และรหัสผ่าน ข้อความที่ตัดตอนมา: |
|
มาดูกันว่าเราจะรับรายชื่อผู้ใช้ออนไลน์ในปัจจุบันได้อย่างไร |
|
โค้ดด้านบนดึงข้อมูล activeSessions จากแอปพลิเคชันและแสดงเวลาที่กำหนด คลาส BeaconDate จะถือว่าเป็นคลาสเวลาที่จัดรูปแบบแล้ว ด้วยวิธีนี้เราจะได้กรอบสำหรับการดูรายชื่อผู้ใช้ออนไลน์ สำหรับเพจรายชื่อผู้ใช้ออนไลน์และฟังก์ชันอื่นๆ นั้นไม่เกี่ยวข้องกับบทความนี้และจะไม่กล่าวถึง นี่คือตัวอย่างของโมเดลที่ไม่รีเฟรชซึ่งอาศัยกลไกการหมดเวลาของเซสชัน sonymusic เพื่อนร่วมงานของฉันชี้ให้เห็นว่าหลายครั้งอาจไม่น่าเชื่อถือเนื่องจากความคิดที่แตกต่างกันของผู้ผลิตแต่ละราย เมื่อพิจารณาข้อกำหนดนี้ มีความจำเป็นต้องพิจารณาว่าเวลานับตั้งแต่การใช้งานครั้งล่าสุดโดยผู้ใช้ปัจจุบันเกินค่าเวลาที่กำหนดไว้ล่วงหน้าหรือไม่ เมื่อรีเฟรชพื้นผิวแต่ละใบ นี่คือการนำการหมดเวลาเซสชันไปใช้ด้วยตนเอง หากคุณต้องการใช้โมเดลการรีเฟรช คุณต้องใช้วิธีนี้ในการตัดสินการรีเฟรชสำหรับพื้นผิวแต่ละใบ |