ในฐานะดาวรุ่งพุ่งแรง 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 เพื่อนร่วมงานของฉันชี้ให้เห็นว่าหลายครั้งอาจไม่น่าเชื่อถือเนื่องจากความคิดที่แตกต่างกันของผู้ผลิตแต่ละราย เมื่อพิจารณาข้อกำหนดนี้ มีความจำเป็นต้องพิจารณาว่าเวลานับตั้งแต่การใช้งานครั้งล่าสุดโดยผู้ใช้ปัจจุบันเกินค่าเวลาที่กำหนดไว้ล่วงหน้าหรือไม่ เมื่อรีเฟรชพื้นผิวแต่ละใบ นี่คือการนำการหมดเวลาเซสชันไปใช้ด้วยตนเอง หากคุณต้องการใช้โมเดลการรีเฟรช คุณต้องใช้วิธีนี้ในการตัดสินการรีเฟรชสำหรับพื้นผิวแต่ละใบ |