ฉันไม่ได้ใช้งานเมื่อเร็ว ๆ นี้และไม่มีโครงการให้ทำดังนั้นฉันจึงแยกแยะปัญหาทั่วไปที่ฉันพบในการทำงานประจำวันของฉัน ก่อนอื่นฉันคิดถึงปัญหาของข้อ จำกัด การเข้าสู่ระบบของผู้ใช้หลายคน ให้ฉันให้ความคิดบางอย่างเกี่ยวกับปัญหานี้
การอ่านที่เกี่ยวข้อง:
Java Web Development Solution Perfect เพื่อป้องกันผู้ใช้หลายคนจากการเข้าสู่ระบบซ้ำ
1. ฉากออกแบบ
1) ผู้ใช้ไม่ได้รับอนุญาตให้เข้าสู่ระบบหลายแห่งในเวลาเดียวกัน
2) ผู้ใช้เข้าสู่ระบบที่ A. ตอนนี้ได้รับอนุญาตให้เข้าสู่ระบบจาก B แต่จะบีบออก (พิจารณาว่าผู้ใช้ได้ไปที่ B เนื่องจากสถานการณ์บางอย่างหลังจากเข้าสู่ระบบที่ A แต่ยังต้องการทำงานก่อนหน้านี้ดังนั้นเขาจึงต้องเข้าสู่ระบบ)
3) หลังจากบีบออกจาก B ระบบจะให้พรอมต์เมื่อ A ดำเนินการอื่น ๆ ผู้ใช้เข้าสู่ระบบที่อื่น หากรหัสผ่านอาจรั่วไหลออกมาหากไม่ใช่เพื่อการทำงานของเขาเองโปรดเปลี่ยนรหัสผ่าน
2. แผนที่ความคิด
เมื่อผู้ใช้แต่ละคนเข้าสู่ระบบเรามักจะจัดเก็บข้อมูลผู้ใช้ในเซสชันเพื่อให้ระบบสามารถรับข้อมูลพื้นฐานของผู้ใช้ได้อย่างง่ายดายเมื่อผู้ใช้ดำเนินการ อย่างไรก็ตามเซสชั่นนี้เป็นส่วนตัวและสามารถมองเห็นได้เฉพาะกับผู้ใช้ปัจจุบัน (หากคุณยอมรับว่าผู้ใช้จะได้รับเซสชันที่แตกต่างกันซึ่งเป็นสาเหตุของสาเหตุที่ผู้ใช้หลายคนสามารถเข้าสู่ระบบได้) จากนั้นคำถามก็มาถึงผู้ใช้จะรู้ได้อย่างไรว่าเขาออนไลน์เมื่อเข้าสู่ระบบ? ฉันเชื่อว่าคุณฉลาดคุณคิดว่านี่ไม่ใช่เรื่องง่าย ปัญหาการจัดเก็บข้อมูลผู้ใช้ออนไลน์ในที่สาธารณะไม่ใช่หรือไม่ หลังจากตรวจสอบออนไลน์โซลูชันจะแตกต่างกันอย่างสิ้นเชิงและเป็นสองประเภทต่อไปนี้
1) ระบุผู้ใช้ออนไลน์ในฐานข้อมูล
2) จัดเก็บในแอปพลิเคชัน
หลังจากการพิจารณาหลายครั้งเราจะพบว่าโซลูชัน 1 จำเป็นต้องแก้ปัญหาที่ยากลำบากมากมาย (ผู้ใช้ทางออกผิดปกติและสถานะการปรับเปลี่ยนในอนาคตการเข้าถึงฐานข้อมูลบ่อยครั้งส่งผลกระทบต่อประสิทธิภาพ ฯลฯ ) ซึ่งเห็นได้ชัดว่าไม่เหมาะสมสำหรับคุณที่ต้องการความสมบูรณ์แบบ ดังนั้นเราจึงนำโซลูชัน 2 บันทึกข้อมูลผู้ใช้ออนไลน์ลงในแอปพลิเคชันและการออกแบบเฉพาะมีดังนี้
1) แผนภูมิการไหลเข้าสู่ระบบ
2) การดำเนินการแผนภูมิการดำเนินการหลังจากถูกบีบออก
3. รหัส
1) วิธีการเข้าสู่ระบบ
@RequestMapping (value = "/ล็อกอิน", method = requestMethod.post) การเข้าสู่ระบบสตริงสาธารณะ (ชื่อผู้ใช้สตริงรหัสผ่านสตริง, การเปลี่ยนเส้นทางการเปลี่ยนเส้นทางการเปลี่ยนเส้นทาง, httpservletrequest คำขอ) {// ตัดสินว่าผู้ใช้ออนไลน์ รหัสผ่านเป็นสตริงผลลัพธ์ที่ถูกต้อง = userservice.login (ชื่อผู้ใช้รหัสผ่าน); if (result.equals ("ความสำเร็จ")) {request.getSession (). setAttribute ("now_user", userservice.findbyusername (ชื่อผู้ใช้)); // สร้างโทเค็นและตรวจสอบสตริง jwttoken = tokenService.createUserauthToken tokensystem.out.println (jwttoken); userauthenticationToken Authtoken = tokenService.RetrieveUserauthToken (jwttoken); // โทเค็นพาร์ทเพย System.out.println (Authtoken.isauthenticated () userauthenticationToken.getCurrentToken (). getUserUUID ()); // ผู้ใช้ถูกตัดการเชื่อมต่อและเปลี่ยนเส้นทางไปยังลิงก์ที่บันทึกไว้หลังจากเข้าสู่ระบบวัตถุ URL = request.getSession () GetAttribute ("Redirect_link"); if (url! = null) {request.getSession (). RemoveAttribute ("redirect_link"); return "redirect:" + url.toString ();} return "index";} redirectattributes.addflashattribute ("ข้อความ"2) เข้าสู่ระบบเพื่อตรวจสอบว่าออนไลน์อยู่แล้ว
@service @transactionalpublic คลาส limitelogin {logger logger แบบคงที่ส่วนตัว = logger.getLogger (sessionListener.class); แผนที่คงที่ส่วนตัว <สตริง, สตริง> loginusermap = new hashmap <> (); String LoginLimite (คำขอ httpservletRequest, String username) {user user = userservice.findbyusername (ชื่อผู้ใช้); string sessionid = request.getSession (). getId (); สำหรับ (คีย์สตริง: logginusermap.keyset ()) ! loginusermap.containsValue (SessionId)) {log.info ("ผู้ใช้:" + user.getUserName () + ", ใน" + dateutil.dateFormat (วันที่ใหม่ (), "yyyy-mm-dd hh: mm: ss") + " "yyyy-mm-dd hh: mm: ss")); logginusermap.remove (user.getUserName ()); break;}} loginusermap.put (user.getUserName (), sessionId); request.getSession (). getServletContext () logginusermap); request.getSession (). getServletContext (). setAttribute ("loginOuttime", loginOuttime); return "success";}}3) Login Interceptor (ไม่มีการเข้าสู่ระบบเพื่อข้ามไปยังหน้าเข้าสู่ระบบ)
Public Class LoginInterceptor ขยาย HandlerInterceptorAdapter {@OverridePublic Boolean prehandle (httpservletRequest Request, httpservletResponse การตอบสนอง, ตัวจัดการวัตถุ) โยนข้อยกเว้น {httpsession session = request.getSession (); ผู้ใช้ = (ผู้ใช้) เซสชัน NULL) {Response.SendRECT (request.getContextPath () + "/อื่น ๆ/tologin"); return false;} // การตัดสินข้อ จำกัด การเข้าสู่ระบบของผู้ใช้หลายคนและให้ Boolean islogin = false; if (ผู้ใช้! = null) {แผนที่ <สตริง session.getServletContext (). getAttribute ("loginusermap"); string sessionid = session.getId (); สำหรับ (คีย์สตริง: logginusermap.keyset ()) {// ผู้ใช้ได้เข้าสู่สถานที่อื่นหาก (key.equals (user.getUserName () && true; break;}}} if (islogin) {แผนที่ <สตริง, สตริง> loginOuttime = (แผนที่ <สตริง, สตริง>) เซสชัน. getServletContext (). getAttribute ("loginOuttime"); sess.setAtatribute ("mess", "ผู้ใช้:" user.getUsername () ที่อื่น! "); loginOuttime.remove (user.getUserName ()); session.getServletContext (). setAttribute (" loginusermap ", loginOuttime); Response.Sendrective (request.getContext () +"/tologin " Postthandle (คำขอ httpservletrequest, การตอบสนอง httpservletResponse, ตัวจัดการวัตถุ, modelandview modelandview) โยนข้อยกเว้น {super.posthandle (คำขอ, การตอบสนอง, ตัวจัดการ, modelandview);}@overridepublic {super.aftercompletion (คำขอ, การตอบสนอง, handler, ex);}}4) เมื่อเซสชันถูกทำลายให้ล้างคู่ค่าคีย์ที่บันทึกไว้ใน loginusermap
คลาสสาธารณะที่มีการใช้งานใช้ httpsessionListener {logger แบบสแตติกส่วนตัว = logger.getLogger (sessionListener.class);@overridepublic void sessionCreated (httpsessionEvent) {} @overridepublic sessionDestroyed (HTTPSISTIONEV session.getId (); // เมื่อเซสชันถูกทำลายล้างคู่ค่าคีย์ที่บันทึกไว้ใน logginuserMap user user = (ผู้ใช้) เซสชัน. getAttribute ("now_user"); ถ้า (user! = null) {แผนที่ <สตริงสตริง> logginusermap = Event.getSession (). getServletContext (). getAttribute ("loginusermap"); if (logginusermap.get (user.getUserName ()). Equals (SessionId)) {log.info ("ผู้ใช้ทำความสะอาดจากแอปพลิเคชัน:" + user.getUserName ()); logginusermap.remove (user.getUserName ()); event.getSession (). getServletContext (). setAttribute ("loginusermap", logginusermap);}}}}}}}}}5) web.xml
<!-การ จำกัด การเข้าสู่ระบบของผู้ใช้หลายคนในการออกจากระบบเพื่อล้างข้อมูลเซสชันในขณะที่ล้างข้อมูลการเข้าสู่ระบบของผู้ใช้ที่เก็บไว้ในแอปพลิเคชัน-> <ผู้ฟัง> <Sistener-Class> com.service.limitelogin.sessionListener </listener-class>
6) รหัสหน้า (ใช้เพื่อล้างข้อมูลเซสชันของผู้ใช้ที่ถูกบีบอัดในขณะที่ให้พรอมต์มิฉะนั้นข้อมูลพรอมต์จะแสดงตลอดเวลา)
<script type = "text/javascript"> $ (เอกสาร) .ready (ฟังก์ชัน () {var message = '$ {mess}'; ถ้า (ข้อความ! = "") {$ .ajax ({type: 'get', async: false, cache: false, url: '/อื่น ๆ/อื่น ๆ {}}); $ ('#mess'). html (ข้อความ);}}); </script>7) ล้างรหัสเซสชันผู้ใช้
/*** ข้อ จำกัด การเข้าสู่ระบบของผู้ใช้หลายคน, ข้อมูลเซสชันที่ชัดเจน (ข้อมูลเข้าสู่ระบบ, ข้อมูลพรอมต์) ** @param Request*@return*/ @responsebody @requestmapping (value = "/clearusersession") สตริงสาธารณะ ClearuserSession request.getSession (); // httpsession.invalidate (); httpsession.removeattribute ("Now_user"); httpsession.removeattribute ("mess"); return "ความสำเร็จ";};งานพัฒนาเสร็จสมบูรณ์ที่นี่
4. ผลการดำเนินงาน
ข้างต้นเป็นวิธีการใช้งานของข้อ จำกัด การเข้าสู่ระบบของผู้ใช้ Java Multi-user ที่แนะนำโดยบรรณาธิการ ฉันหวังว่ามันจะเป็นประโยชน์กับคุณ หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับคุณทันเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!