ในโครงการเว็บปัจจุบันสถานการณ์หลายอย่างคือข้อมูลบัญชีเดียวกันสามารถลงชื่อเข้าใช้ที่พอร์ทัลเข้าสู่ระบบที่แตกต่างกันในครั้งนี้ดังนั้นมันจะไม่สวยงาม
แนะนำการอ่าน:
การดำเนินการตามข้อ จำกัด การเข้าสู่ระบบของผู้ใช้ Java
ขณะนี้มีวิธีแก้ปัญหาสองประการ:
1. บันทึกข้อมูลการเข้าสู่ระบบของผู้ใช้ด้วยฟิลด์ในธง ทุกครั้งที่การเข้าสู่ระบบสำเร็จจะมีการทำเครื่องหมาย 1 และการเข้าสู่ระบบจะถูกทำเครื่องหมาย 0 เมื่อมีการทำเครื่องหมาย 1 จะไม่ได้รับอนุญาตให้เข้าสู่ระบบ
2. บันทึกข้อมูลการเข้าสู่ระบบของผู้ใช้ในขอบเขตในตัวของแอปพลิเคชันจากนั้นใช้ตัวฟังเซสชันเพื่อตรวจสอบสถานะการเข้าสู่ระบบของผู้ใช้ที่เข้าสู่ระบบแต่ละคน
เห็นได้ชัดว่าวิธีแรกต้องใช้ฐานข้อมูลทุกครั้งที่คุณเข้าสู่ระบบซึ่งจะเพิ่มค่าใช้จ่ายด้านประสิทธิภาพที่ไม่จำเป็น ยิ่งกว่านั้นหากคอมพิวเตอร์ปิดตัวลงในระหว่างสถานะเข้าสู่ระบบคุณจะไม่สามารถเข้าสู่ระบบได้และการใช้งานค่อนข้างต่ำ
แต่วิธีที่สองนั้นแตกต่างกันสามารถใช้งานได้สูงและสะดวกในการรักษาข้อมูลของผู้ใช้ออนไลน์ทั้งหมด
ต่อไปเราจะแนะนำการใช้งานเฉพาะของวิธีที่สองเป็นหลัก:
1. ในวิธีการเข้าสู่ระบบสำหรับการประมวลผลการเข้าสู่ระบบค้นหาฐานข้อมูลแรกเพื่อตรวจสอบว่าผู้ใช้มีอยู่หรือไม่ หากมีให้พิจารณาว่าบัญชีล็อกอินถูกล็อคหรือไม่ จากนั้นนำข้อมูลการเข้าสู่ระบบทั้งหมดออกจากวัตถุขอบเขตในตัวแอปพลิเคชันเพื่อตรวจสอบว่าบัญชีชื่อผู้ใช้ได้รับการลงชื่อเข้าใช้หรือไม่หากมีการลงชื่อเข้าใช้มันจะเป็นพรอมต์ที่เป็นมิตร มิฉะนั้นหมายความว่าคุณสามารถเข้าสู่ระบบและบันทึกข้อมูลการเข้าสู่ระบบในแอปพลิเคชันในรูปแบบของคู่คีย์-ค่า
รหัสมีดังนี้:
// การกระทำจะต้องเพิ่มในแต่ละวิธีการเข้าถึงก่อนการกำหนดค่าเป็นศูนย์มิฉะนั้น 404 @Action (value = "เข้าสู่ระบบ" ผลลัพธ์ = {@Result (name = "index", location = "index.jsp"),}) สตริงสาธารณะเข้าสู่ระบบ () โยนข้อยกเว้น {ลอง if (result! = null) {ถ้า (result.getFustatus ()! = null && result.getFustatus () == 0) {super.setRequestattr (constant.message, "ขออภัยผู้ใช้รายนี้ถูกล็อค!"); ส่งคืน "ข้อผิดพลาด"; } แผนที่ <สตริง, สตริง> logginusermap = (แผนที่ <สตริง, สตริง>) super.getApplicationAttr (constant.login_user_map); บูลีน isExist = false; string sessionId = super.getSessionId (เท็จ); if (logginusermap == null) {logginusermap = new hashmap <string, string> (); } สำหรับ (ชื่อผู้ใช้สตริง: logginusermap.keyset ()) {// ตัดสินว่าข้อมูลของผู้ใช้ที่เข้าสู่ระบบได้รับการบันทึกหรือหากผู้ใช้รายเดียวกันลงชื่อเข้าใช้ซ้ำแล้วซ้ำ } isExist = true; หยุดพัก; } ถ้า (isExist) {super.setRequestattr (constant.message, "ขออภัยผู้ใช้เข้าสู่ระบบ!"); ส่งคืน "ข้อผิดพลาด"; } else {loginusermap.put (result.getFuusername (), sessionId); } // เข้าสู่ระบบประสบความสำเร็จ super.setsessionattr (constant.login_user, ผลลัพธ์); super.setApplicationAttr (constant.login_user_map, logginusermap); logger.info (result.getFuusername () + "เข้าสู่ระบบสำเร็จ!"); // ถ้า FromURL มีค่าในเซสชันให้ข้ามไปที่สตริงหน้า FromURL = (String) super.getSessionAttr (constant.from_url); if (fromurl! = null) {super.setsessionattr (constant.from_url, null); super.getResponse (). sendretirect (fromurl.toString ()); คืนค่า null; } return "index"; }} catch (exception e) {e.printstacktrace (); logger.info ("เข้าสู่ระบบล้มเหลว:"+e.getMessage ()); } super.setRequestattr ("ข้อความ", "ข้อผิดพลาด"); ส่งคืน "ข้อผิดพลาด"; -2. หลังจากประมวลผลพอร์ทัลเข้าสู่ระบบโดยพิจารณาว่าเซสชันจะสิ้นสุดลงผู้ใช้เข้าสู่ระบบที่สอดคล้องกันควรออกจากระบบเข้าสู่ระบบ เราสามารถเขียนผู้ฟังเซสชัน เมื่อเซสชันถูกทำลายเราออกจากระบบผู้ใช้ที่เข้าสู่ระบบนั่นคือลบออกจากแอปพลิเคชัน หมายความว่าผู้ใช้ออฟไลน์
รหัสมีดังนี้:
แพ็คเกจ com.facelook.util; นำเข้า java.util.map; นำเข้า Javax.servlet.http.httpsessionEvent; นำเข้า Javax.servlet.http.httpsessionListener; นำเข้า org.apache.log4j.logger; นำเข้า com.facelook.entity.user; Public Class SessionListener ใช้ httpsessionListener {logger ส่วนตัว logger = logger.getLogger (this.getClass ()); @Override โมฆะสาธารณะ SessionCreated (เหตุการณ์ httpsessionEvent) {} @Override โมฆะสาธารณะ sessionDestroyed (เหตุการณ์ httpsessionEvent) {// ล้างคู่ค่าคีย์ที่บันทึกไว้ใน logginusermap เมื่อเซสชันถูกทำลายผู้ใช้ = (ผู้ใช้) เหตุการณ์ if (user! = null) {map <string, string> logginusermap = (แผนที่ <สตริง, string>) event.getSession (). getServletContext (). getAttribute ("loginusermap"); logginusermap.remove (user.getfuusername ()); Event.getSession (). getServletContext (). setAttribute ("loginusermap", loginuserMap); -การกำหนดค่าใน web.xml มีดังนี้:
<!-ผู้ฟังเซสชัน-> <ผู้ฟัง> <Sistener-Lass> com.facelook.util.sessionListener </listener-class> </listener>
3. นอกจากนี้ยังมีปัญหาอื่น หากผู้ใช้เข้าสู่ระบบปิดเบราว์เซอร์หรือหน้าโดยไม่ต้องคลิกปุ่มออกจากระบบ จากนั้นคุณสามารถใช้เหตุการณ์ก่อนการโหลดเพื่อยิงเมื่อเบราว์เซอร์รีเฟรชหรือปิด
// events $ (window) .bind ('pouldload', function () {$ .ajax ({url: "$ {ctx} /system/user/user!logout.action", พิมพ์: "โพสต์", ความสำเร็จ: ฟังก์ชั่น () {แจ้งเตือน (อย่างไรก็ตามหากเหตุผลบางประการเช่นคอมพิวเตอร์ปิดทันทีการรีสตาร์ทอัตโนมัติ ฯลฯ สิ่งเหล่านี้ไม่สามารถหลีกเลี่ยงได้ดังนั้นคุณสามารถรอเซสชันเซสชันฝั่งเซิร์ฟเวอร์เพื่อรีเซ็ตก่อนที่คุณจะสามารถเข้าสู่ระบบได้อีกครั้ง
ผู้ดูแลระบบจะจัดการสถานะการเข้าสู่ระบบและการออกจากระบบของบุคลากรออนไลน์และทำลายผู้ใช้ที่เข้าสู่ระบบด้วยปัญหาโดยตรง
ถัดไปขอแนะนำการจัดการโมดูลบุคลากรออนไลน์สั้น ๆ :
1. ก่อนอื่นจำเป็นต้องมีผู้ฟังเซสชันเพื่อตรวจสอบการตอบกลับทั้งหมดสร้างสถานการณ์ ในเวลานี้ทุกครั้งที่มีการสร้างเซสชันนับ+1 สามารถนับได้และจากนั้น Count-1 จะถูกทำลาย นอกจากนี้จำเป็นต้องมีการฟัง ServletContext เพื่อตรวจสอบวงจรชีวิตของเว็บแอปพลิเคชันรับวัตถุ ServletContext จากนั้นนับจำนวนบุคลากรออนไลน์ทั้งหมดและจัดเก็บไว้ในนั้น
รหัสเฉพาะมีดังนี้:
แพ็คเกจ com.facelook.util; นำเข้า java.util.map; นำเข้า Javax.servlet.servletContext; นำเข้า Javax.servlet.servletContextEvent; นำเข้า Javax.servlet.servletContextListener; นำเข้า Javax.servlet.http.httpsessionEvent; นำเข้า Javax.servlet.http.httpsessionListener; นำเข้า Javax.servlet.http.httpsessionListener; นำเข้า org.apache.log4j.logger; นำเข้า com.facelook.entity.user; SessionListener คลาสสาธารณะใช้ httpsessionListener, servletContextListener {จำนวน int ส่วนตัว; servletContext ส่วนตัว servletContext = null; Public SessionListener () {count = 0; } ตัวบันทึกส่วนตัว logger = logger.getLogger (this.getClass ()); @Override โมฆะสาธารณะ SessionCreated (เหตุการณ์ httpsessionEvent) {count ++; SetContext (เหตุการณ์); logger.info ("************ เซสชัน http ถูกสร้างขึ้น ... ****************"); } @Override โมฆะสาธารณะ sessionDestroyed (เหตุการณ์ httpsessionEvent) {// ล้างคู่ค่าคีย์ที่บันทึกไว้ใน logginUserMap เมื่อเซสชันถูกทำลายผู้ใช้ผู้ใช้ = (ผู้ใช้) event.getSession () GetAttribute ("LoginUser"); if (user! = null) {map <string, string> logginusermap = (แผนที่ <สตริง, string>) event.getSession (). getServletContext (). getAttribute ("loginusermap"); logginusermap.remove (user.getfuusername ()); Event.getSession (). getServletContext (). setAttribute ("loginusermap", loginuserMap); } นับ--; SetContext (เหตุการณ์); logger.info ("************ เซสชั่น http ถูกทำลาย ... *******************"); } โมฆะสาธารณะ setContext (httpsessionEvent httpsessionEvent) {httpsessionEvent.getSession (). getServletContext (). setAttribute ("ออนไลน์" นับ); } @Override เป็นโมฆะสาธารณะบริบท (servletContextEvent servletContextEvent) {this.servletContext = null; logger.info ("************ บริบท servlet ถูกทำลาย ... *******************"); } @Override โมฆะสาธารณะบริบท (servletContextEvent servletContextEvent) {this.servletContext = servletContextEvent.getServletContext (); logger.info ("************ บริบท servlet เริ่มต้น ... ****************"); -2. สร้างโมดูลเพื่อจัดการผู้ใช้ออนไลน์ในการทำปฏิกิริยาและสนับสนุนฟังก์ชั่นออกจากการบังคับ
/ ** * logout * @return * @throws servletexception * @throws ioexception */ ล็อกเอาต์สตริงสาธารณะ () พ่น servletexception, ioexception {ลอง {แผนที่ <สตริง, สตริง> logginusermap = (แผนที่ <สตริง, สตริง>) super.getApplicationAttr ผู้ใช้ผู้ใช้ = (ผู้ใช้) super.getSessionAttr (constant.login_user); super.RemoveAttribute (constant.login_user_map); logginusermap.remove (user.getfuusername ()); super.setApplicationAttr (constant.login_user_map, logginusermap); logger.info ("เข้าสู่ระบบเข้าสู่ระบบสำเร็จ!"); } catch (exception e) {e.printstacktrace (); logger.error ("เข้าสู่ระบบล้มเหลว:"+e.getMessage ()); } ส่งคืนอินพุต; } / *** การจัดการผู้ใช้ออนไลน์* @return* / Public String loginManager () {return success; } / *** บังคับให้ออกจากผู้ใช้รายอื่น* @return* / public String logoutother () {ลอง {string username = servletactionContext.getRequest (). getParameter ("ชื่อผู้ใช้"); แผนที่ <string, string> loginusermap = (แผนที่ <สตริง, สตริง>) super.getApplicationAttr (constant.login_user_map); if (ชื่อผู้ใช้! = null && logginusermap.containskey (ชื่อผู้ใช้)) {loginusermap.remove (ชื่อผู้ใช้); super.setApplicationAttr (constant.login_user_map, logginusermap); }} catch (exception e) {e.printstacktrace (); logger.info ("ออกจากการบังคับให้ล้มเหลว:"+e.getMessage ()); } return null; -3. โหลดรายการผู้ใช้ออนไลน์ในหน้าการจัดการ
หลังจากกำหนดวิธีการที่สอดคล้องกันแล้วเพิ่มรายการออนไลน์ในหน้าการจัดการที่เกี่ยวข้องดังนี้:
<%@page import = "java.util.map"%> <%@page import = "java.util.map.entry"%> <%@page language = "java" pageencoding = "utf-8"%> <%@รวมไฟล์ = "สามัญ/taglib.jsp"%> transitional // en "" http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd "> <html xmlns =" http://www.w3.org/1999/xhtml " content = "text/html; charset = utf-8"/> <title> ยินดีต้อนรับสู่ facelook </title> < %@ รวมไฟล์ = "/common/resource.jsp" %> <script type = "text/javascript"> <!-// events $ (window) .bind (' URL: "$ {ctx} /system/user/user!logout.action", ประเภท: "โพสต์", ความสำเร็จ: ฟังก์ชั่น () {แจ้งเตือน ("คุณได้ออกจากระบบ"); ฟังก์ชั่น logout (ชื่อผู้ใช้) {if (username == "$ {sessionscope.loginuser.fuusername}") {alert ("ออกจากระบบบัญชีของคุณ!"); กลับ; } $ .ajax ({url: "$ {ctx} /system/user/user!logoutother.action?astername ="+ชื่อผู้ใช้, ประเภท: "โพสต์", ความสำเร็จ: ฟังก์ชั่น () {$ ("#tr"+ชื่อผู้ใช้) .hide (); $ ("#count"). html (count-1); } //-> </script> </head> <body> <%@ include file = "/common/header.jsp"%> <div id = "main"> <%@ include file = "/common/lefter.jsp"%> <div> <div> <h2> out.println ("ปัจจุบันมี <font id = 'count'>"+map.size ()+"</font> ผู้ใช้ออนไลน์ !!"); %> <bable> <%สำหรับ (รายการ <สตริง, สตริง> m: map.entryset ()) {%> <tr id = "tr <%= m.getKey ()%>"> <td> <%= m.getKey ()%> </td> <td> <%}%> </table> </div> </div> </div> <%@ include file = "/footer.jsp"%> <%@ include file = "/message/message.jsp"%> </body> </html>ตกลงเริ่มโครงการปรับใช้จากนั้นเริ่มบริการและป้อนโมดูลการจัดการผู้ใช้ออนไลน์ เอฟเฟกต์ง่าย ๆ มีดังนี้:
ควรสังเกตว่าผู้ใช้ล็อกอินปัจจุบันไม่ได้รับอนุญาตให้บังคับให้ออกจากระบบจากข้อมูลการเข้าสู่ระบบของเขา/เธอ
ด้วยวิธีนี้กรณีของการป้องกันไม่ให้ผู้ใช้หลายคนเข้าสู่ระบบสามารถรับรู้ได้!
ด้านบนเป็นทางออกที่สมบูรณ์แบบสำหรับการพัฒนาเว็บ Java เพื่อป้องกันไม่ให้ผู้ใช้หลายคนเข้าสู่ระบบซ้ำ ๆ ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับทุกคนในเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!