บทความนี้ส่วนใหญ่แนะนำการใช้การฟังเซสชันใน Java เพื่อให้ได้ข้อ จำกัด การเข้าสู่ระบบและจำนวนการเข้าสู่ระบบสำหรับบัญชีเดียวกัน รหัสเฉพาะมีดังนี้:
โดเมนปัญหา:
1. เข้าสู่ระบบด้วยบัญชีเดียวกัน: หากบัญชีนี้เข้าสู่ระบบแล้วคุณไม่สามารถเข้าสู่ระบบได้อีก (ตรงข้ามกับโหมด QQ)
2. หากจำนวนการเข้าสู่ระบบมี จำกัด หากจำนวนคนเกินหรือถึงมาถึงแล้วพรอมต์คือ: ระบบไม่ว่างลองอีกครั้งในภายหลัง
วิธีแก้ปัญหา: ใช้ผู้ฟัง httpsessionattributeListener (แม้ว่าฉันจะใช้ httpsessionListener ในเวลาเดียวกัน แต่ก็รู้สึกยากที่จะทำงาน)
ความรู้สำรอง: httpsessionattributelistener มีสามวิธี: attributeadd, attributeRemove และ attributeReplace
SetAttribute และ RemoveAttribute ของเซสชันจะทริกเกอร์วิธี AttributeAdd และ AttributeRemove การตั้งค่าซ้ำ ๆ ของแอตทริบิวต์เดียวกันของเซสชันเดียวกันจะทำให้เกิดวิธีการ attributeReplace
เหตุผลที่ HttpsessionListener ทำงานได้ยาก: ตราบใดที่คุณเข้าถึงหน้า JSP คุณจะสร้างเซสชัน (คุณจะไม่สร้างเซสชันเมื่อเข้าถึง HTML บนฝั่งเซิร์ฟเวอร์ตัวอย่างเช่นหากคุณเรียก Httpsertrequest.getSession (จริง) ใน Servlet คุณจะสร้างมัน) JSP เป็นหน้าแบบไดนามิกและเป็นหลัก login.jsp ของฉันเห็นได้ชัดว่าเป็น JSP เมื่อฉันทำให้เซสชันในการฟังไม่ถูกต้องและกลับไปที่หน้าเข้าสู่ระบบฉันสร้างเซสชันอื่นทันที นี่คือสิ่งที่ฉันไม่รู้สึกชัดเจนและฉันไม่ได้กลับบ้านจากทักษะของฉัน
การใช้งานเฉพาะ:
รหัสฟัง
ชั้นเรียนสาธารณะ Onlinelistener ใช้ httpsessionListener, httpsessionattributeListener {รายการคงที่ส่วนตัว <Sessionanduser> เซสชัน; int int dels = -1; ธงบูลีนคงที่ = เท็จ; คงที่ {ถ้า (เซสชัน == null) {เซสชัน = คอลเลกชัน. synchronizedList (arrayList ใหม่ <SessionAndUser> ()); }} โมฆะสาธารณะ sessionCreated (httpsessionEvent HSE) {system.out.println (hse.getSession () + "-" + วันที่ใหม่ ()); System.out.println (hse.getSession () + "-" + วันที่ใหม่ ()); } โมฆะสาธารณะ sessionDestroyed (httpsessionEvent HSE) {system.out.println ("------------- เซสชัน destroyed () -----------"); System.out.println (hse.getSession () + "" + วันที่ใหม่ (hse.getSession (). getLastaccessedTime ())); System.out.println (hse.getSession () + "" + วันที่ใหม่ ()); } โมฆะสาธารณะ artributeDded (httpsessionBindingEvent e) {system.out.println ("-------------*เริ่มเพิ่ม*-----------------------" + เซสชัน SISE ()); httpsession session = e.getSession (); ActionContext CTX = ActionContext.getContext (); บูลีน newOne = true; string attrName = e.getName (); // เข้าสู่ระบบ if (attrName.equals (constant.user_name)) {// ตรวจสอบจำนวนการเข้าสู่ระบบถ้า (sessions.size ()> = constant.user_limit) {newOne = false; ctx.put ("TimeOutmsg", "ServerBusy"); } string nowUser = (สตริง) e.getValue (); // สำรวจเซสชันทั้งหมดเพื่อตรวจสอบว่าคุณได้ลงชื่อเข้าใช้หรือไม่ถ้าเป็นเช่นนั้นมันจะแจ้งให้คุณเข้าสู่ระบบสำหรับ (int i = sessions.size ()-1; i> = 0; i--) {sessionanduser tem = sessions.get (i); if (tem.getUserName (). เท่ากับ (NowUser)) {newOne = false; ctx.put ("TimeOutmsg", "beenloged"); // tem.getSession (). unvalidate (); // // เข้าสู่ระบบด้วยบัญชีเดียวกันและโทรออกโดยอัตโนมัติ }} // เพิ่มบัญชีเข้าสู่ระบบใหม่ในรายการการบำรุงรักษาบัญชีถ้า (newOne) {SessionAndUser SAU = ใหม่ SessionAndUser (); sau.setusername (Nowuser); SAU.SETSESSION (เซสชั่น); sau.setsid (session.getId ()); เซสชัน ADD (SAU); }}} โมฆะสาธารณะ attributerEmoved (httpsessionBindingEvent e) พ่น unlusalStateException {httpsession เซสชัน = e.getSession (); System.out .println ("-------------*เริ่มลบ*-------------------" + sessions.size ()); if (dels> -1) {if (flag) {sessions.remove (dels); ธง = เท็จ; }} else {// 登录 string attrName = e.getName (); if (attrName.equals (constant.user_name)) {string nowuser = (string) e.getValue (); // Traverse เซสชันทั้งหมดสำหรับ (int i = sessions.size ()-1; i> = 0; i--) {sessionanduser tem = sessions.get (i); if (tem.getUserName (). เท่ากับ (NowUser)) {sessions.remove (i); หยุดพัก; }}}}} โมฆะสาธารณะ attributeRePlaced (httpsessionBindingEvent e) {เซสชั่น httpsession = e.getSession (); System.out .println ("-------------*เริ่มแทนที่*-------------------" + sessions.size ()); string attrName = e.getName (); dels = -1; // 登录 if (attrName.equals (constant.user_name)) {// user nowuser = (ผู้ใช้) e.getValue (); // ค่าสตริงเก่า nowuser = (string) เซสชัน. getAttribute (constant.user_name); // 当前เซสชัน = เซสชัน get (i); if (tem.getUserName (). เท่ากับ (NowUser) &&! tem.getSid (). เท่ากับ (session.getId ())) {system.out.println ("ลบ: ไม่ถูกต้อง 1!"); dels = i; ธง = จริง; } อื่นถ้า (tem.getSid (). เท่ากับ (session.getId ())) {tem.setUserName (NowUser); }} if (dels! = -1) {sessions.get (dels) .getSession (). invalidate (); // วิธีการลบจะถูกเรียกโดยอัตโนมัติเมื่อมันล้มเหลว มันจะถูกลบออกจากเซสชัน}}}} แนวคิดหลักของรหัสคือการกำหนดรายการคงที่ <เซสชันและเซอร์> เพื่อจัดเก็บเซสชันและชื่อบัญชี
รหัสเพื่อให้ได้ค่าส่งคืนผู้ฟังและประมวลผลในการดำเนินการที่เข้าสู่ระบบ
session.setAttribute (constant.user_name, operator.getUserName ()); ActionContext CTX = ActionContext.getContext (); if ("ServerBusy" .equals (ctx.get ("TimeOutMsg"))) {ctx.put ("TimeOutmsg", "เซิร์ฟเวอร์ไม่ว่างโปรดลองอีกครั้งในภายหลัง"); กลับ "กระโดด"; } if ("beenloged" .equals (ctx.get ("TimeOutmsg"))) {ctx.put ("TimeOutmsg", "บัญชีนี้ถูกบันทึกไว้ในที่อื่น"); กลับ "กระโดด"; - รหัสข้อมูลแจ้งการจับภาพหน้าเว็บ
<%@taglib prefix = "s" uri = " /struts-tags"%> <s: property value = "#attr.timeOutmsg" />
ขอบคุณสำหรับการอ่านฉันหวังว่ามันจะช่วยคุณได้ ขอบคุณสำหรับการสนับสนุนเว็บไซต์นี้!