ฟังก์ชั่นของการลงชื่อเข้าใช้เดียวยังคงมีความสำคัญมากในสถานการณ์แอปพลิเคชันจริง อย่างมีเหตุผลเราไม่อนุญาตให้ผู้ใช้ดำเนินการสองการดำเนินการในเวลาเดียวกัน มาเรียนรู้เกี่ยวกับการใช้งาน sign-on เดียวของ SpringMVC
Interceptor ของ SpringMVC นั้นแตกต่างจาก Interceptor ของ Spring SpringMVC มีรายการ dispatcherservlet แบบรวม คำขอทั้งหมดผ่าน Dispatcherservlet ดังนั้นคุณจะต้องทำเอะอะบน Dispatcherservlet เท่านั้น Dispatcherservlet ไม่มีพร็อกซีและคอนโทรลเลอร์ที่จัดการโดย SpringMVC ไม่มีพร็อกซี
1. ครั้งแรกที่สำรวจหลักการการใช้งานพื้นฐาน: ฟังก์ชั่นนี้ค่อนข้างง่ายนั่นคือผู้ใช้เพียงรายเดียวเท่านั้นที่สามารถทำงานในโครงการเว็บเดียวกันในเวลาเดียวกันดังนั้นนี่คือการค้นพบการเข้าสู่ระบบระยะไกลและสองเส้นทางที่ได้รับการแนะนำที่นี่ 1. เซิร์ฟเวอร์ค้นพบว่าผู้ใช้ที่เข้าสู่ระบบได้ดำเนินการเข้าสู่ระบบอีกครั้งผ่าน IP อื่นแล้วผลักการเตือนให้ผู้ใช้รายแรกเข้าสู่ระบบเข้าสู่ระบบรีโมต 2. เมื่อผู้ใช้ดำเนินการเขาพบว่าบัญชีของเขาถูกบีบออกและมีการเข้าสู่ระบบระยะไกล เกี่ยวกับการแก้ปัญหาทั้งสองนี้สิ่งแรกเป็นแบบเรียลไทม์มากขึ้น แต่ยังคงถูกสำรวจอยู่ มามุ่งเน้นไปที่วิธีที่สองด้านล่าง
2. การใช้ประเภทที่สองนั้นค่อนข้างง่าย มีสองปฏิบัติการ หนึ่งคือการเพิ่มฟิลด์พิเศษลงใน SessionID ของผู้ใช้เพื่อจัดเก็บเซสชันของผู้ใช้ที่เข้าสู่ระบบเนื่องจากคำขอแต่ละคำขอแต่ละคำขอสอดคล้องกับเซสชันที่ไม่ซ้ำกันซ้ำ จากนั้นใช้เทคโนโลยี Interceptor ที่สกัดกั้นการดำเนินงานของผู้ใช้ ใน Interceptor คำขอ URL ที่เกี่ยวข้องในหน้าเข้าสู่ระบบจะถูกปล่อยออกมาครั้งแรกและอีกอันคือคำขอตรวจสอบการเข้าสู่ระบบจะถูกปล่อยออกมา ในที่สุดกรองผู้ใช้ (เกี่ยวกับการเข้าสู่ระบบของผู้ใช้เมื่อการตรวจสอบสำเร็จไม่เพียง แต่ผู้ใช้จะถูกเก็บไว้ในเซสชันสำหรับการตรวจสอบการสกัดกั้นการเข้าสู่ระบบ แต่ยังต้องจัดเก็บรหัสเซสชันในเซสชั่นที่สอดคล้องกันในตารางผู้ใช้) สำหรับคำขอคำขอในเวลานี้ หากความแตกต่างคือการเข้าสู่ระบบการกระโดดแบบออฟไลน์จะได้รับแจ้งให้กระโดดเข้าสู่ระบบเนื่องจากจะมีเซสชันในการดำเนินการเซิร์ฟเวอร์การเชื่อมต่อผู้ใช้ ตราบใดที่เซสชันหมดอายุรหัสเซสชันของการดำเนินการที่ผู้ใช้แต่ละคนเริ่มต้นจะเหมือนกันดังนั้นมันจะตรงกับ ID ที่เก็บไว้ในฐานข้อมูลเมื่อเข้าสู่ระบบเมื่อมีคนอื่นผ่านอุปกรณ์อื่นให้ใช้บัญชีเดียวกันเพื่อป้อน เซสชันจะถูกสร้างขึ้นอีกครั้งเมื่อเข้าสู่ระบบเซสชันในฐานข้อมูลจะรีเฟรช SessionID ในฐานข้อมูล แต่ SessionID ยังคงไม่เปลี่ยนแปลง อย่างไรก็ตามเซสชันในฐานข้อมูลมีการเปลี่ยนแปลง ดังนั้นเมื่อตรวจสอบว่า SessionID ในฐานข้อมูลมีความสอดคล้องกันใน interceptor มันจะล้มเหลวในการสกัดกั้นการทำงานของผู้ใช้เพื่อให้ได้ฟังก์ชั่นของการเข้าสู่ระบบของผู้ใช้เดี่ยว (หมายเหตุเกี่ยวกับเซสชันเมื่อผู้ใช้เชื่อมต่อกับเซิร์ฟเวอร์เป็นครั้งแรกเซสชันจะถูกสร้างขึ้นบนฝั่งเซิร์ฟเวอร์และจากนั้นการดำเนินการทุกครั้งที่ผู้ใช้เริ่มต้นจะมี ID ของเซสชันนี้และสถานการณ์บางอย่างจะเกิดขึ้นผู้ใช้ไม่ได้ทำงานกับเซิร์ฟเวอร์เป็นเวลานาน
ต่อไปนี้คือการใช้งาน interceptor ใน SpringMVC
คลาสสาธารณะ SingleUnterinterceptor ใช้ HandlerInterceptor {@autowiredPrivate USermapper Mapper; โมฆะสาธารณะหลังการรวม (httpservletrequest arg0, httpservletresponse arg1, arg2, ข้อยกเว้น arg3) httpservletResponse arg1, Object Arg2, modelandview arg3) โยนข้อยกเว้น {// toDo วิธีการที่สร้างขึ้นอัตโนมัติ stub} prehandle บูลีนสาธารณะ (httpservletrequest arg0, httpservletResponse arg1, arg2) if (url.indexof ("login.jsp")> = 0 || url.indexof ("ใหม่/เข้าสู่ระบบ")> = 0 || url.indexof ("checkuser")> = 0) {return true;} // ถ้าชื่อผู้ใช้มีอยู่ arg0.getSession (). getAttribute ("ผู้ใช้"); ถ้า (user! = null) {String sessionId = mapper.getUserEntity (integer.valueof (ผู้ใช้)). getSessionId (); ถ้า (sessionid.equals (arg0.getSession () else {arg1.setstatus (arg1.sc_gateway_timeout); arg1.setContentType ("ข้อความ/html; charset = utf-8"); printwriter out = arg1.getwriter () out.println ("<html>"); ที่อื่นคุณถูกบังคับให้ไปออฟไลน์ ') "); out.println (" window.open (' " + arg0.getcontextpath () +" /new/login' ,'_top') arg0.getRequestDispatcher ("login.jsp"). forward (arg0, arg1); return false;}} arg0.getRequestDispatcher ("login.jsp"). forward (arg0, arg1); return false;}}}}}รหัสข้างต้นสามารถรับรู้ฟังก์ชั่นของผู้ใช้ที่เข้าสู่ระบบคนแรกที่ถูกบีบออกจากบรรทัดเมื่อผู้ใช้เดียวกันบันทึกในหลายครั้ง มันสามารถตระหนักถึงฟังก์ชั่นของการแจ้งเตือนบัญชีให้เข้าสู่ระบบจากระยะไกลจากนั้นกระโดดไปที่หน้าเข้าสู่ระบบ ที่นี่เราต้องอธิบายประเด็นสำคัญของฟังก์ชั่นการแจ้งเตือนการแจ้งเตือนอย่างง่ายนี้ หากการแจ้งเตือนนี้ปรากฏขึ้นจะต้องสามารถยุติคำขอได้ จากนั้นฟังก์ชั่นการพิมพ์ตอบกลับจะส่งออกคำสั่งแจ้งเตือนการแจ้งเตือนดังนั้นคำสั่ง Jump ที่แสดงความคิดเห็นจึงไม่สามารถมีอยู่ได้ หากมีคำสั่งแจ้งเตือนการแจ้งเตือนจะไม่ถูกออกเนื่องจากการดำเนินการของคุณไม่สิ้นสุดอย่างถูกต้อง แต่ถูกส่งต่อหรือเปลี่ยนเส้นทางไปยังการดำเนินการอื่น ๆ ไม่ว่าจะถูกต้องหรือไม่ก็ตามมันจะถูกส่งออกจากการกระทำอื่น ๆ ไปยังหน้าดังนั้นคำสั่งการพิมพ์คำตอบของคุณจะไม่ปรากฏขึ้น ดังนั้นวิธีที่ถูกต้องคือ: คำขอการสกัดกั้นไม่ได้ถูกปล่อยออกมา (returnFalse) และคำขอยังคงเป็นคำขอเดิมและจะไม่กระโดด ข้อมูลการพิมพ์ของการตอบกลับกลับไปที่หน้าสามารถแสดงได้ สำหรับการกระโดดไปยังหน้าเข้าสู่ระบบคุณสามารถใช้: out.println ("window.open ('"+arg0.getcontextpath ()+"/ใหม่/เข้าสู่ระบบ', '_ top');"); ในการดำเนินการตามคำขอการดำเนินการจะดำเนินการในส่วนของเอาต์พุต JS โดยการตอบกลับชี้ไปที่หน้าเข้าสู่ระบบ
รหัสข้างต้นนั้นถือว่าเป็นฟังก์ชั่นการเข้าสู่ระบบของผู้ใช้เพียงครั้งเดียว แต่คุณจะพบว่าการดำเนินการของคำขอ AJAX ไม่ได้ชี้ไปที่หน้าเข้าสู่ระบบเมื่อเข้าสู่ระบบในตำแหน่งระยะไกลและไม่มีข้อมูลแจ้ง ให้ฉันอธิบายเหตุผลก่อนเพราะ AJAX ของคุณกำลังร้องขอแบบอะซิงโครนัสและ URL ที่ร้องขอจะถูกจับคู่ในตัวประมวลผล Mapper ดังนั้นจึงจะถือว่าเป็นคำขอที่ประสบความสำเร็จ (รหัสสถานะการส่งคืนคือ 200) คำสั่ง JS ที่พิมพ์ในการตอบกลับข้างต้นจะกลายเป็นคำขอที่ประสบความสำเร็จในความสำเร็จและมูลค่าคืน คุณสามารถลองแสดงความคิดเห็นประโยคข้างต้น: arg1.setstatus (arg1.sc_gateway_timeout); ในเวลานี้จำเป็นต้องดำเนินการอื่น ๆ ครั้งแรกคือคำสั่ง arg1.setstatus (arg1.sc_gateway_timeout); ฟังก์ชั่นคือการตั้งค่ารหัสสถานะที่ส่งคืนโดยการตอบกลับ การตั้งค่าข้างต้นระบุว่ารหัสสถานะ 504 จะถูกส่งคืนเพื่อแสดงข้อผิดพลาดในการร้องขอ ในเวลานี้คำขอ AJAX จะไม่ตอบสนองในวิธีการประสบความสำเร็จอีกต่อไป แต่จะตอบสนองต่อวิธีข้อผิดพลาดของ AJAX ดังนั้นคุณจะต้องดำเนินการวิธีการที่เกี่ยวข้องในข้อผิดพลาด AJAX ตัวอย่างเช่น:
$ .ajax ({url: 'new/msd2', ความสำเร็จ: ฟังก์ชั่น (a) {alert (a);}, ข้อผิดพลาด: ฟังก์ชั่น (rs) {ถ้า (rs.status == 504) {document.write (rs.responsetext);}}});เมื่อคำขอ AJAX ถูกสกัดกั้นเนื่องจากการเข้าสู่ระบบระยะไกลให้ตั้งค่า arg1.setstatus (arg1.sc_gateway_timeout); สถานะการส่งคืนของคำขอสามารถเปลี่ยนเป็น 504 จากนั้นวิธีการผิดพลาดจะตอบกลับ เมื่อมีการพิจารณาว่าสถานะเป็นรหัสสถานะที่คุณตั้งค่า Document.write (Rs.ResponSetext); ResponseText เป็นคำสั่ง JS ที่พิมพ์ไปยังแผนกต้อนรับใน Interceptor สำหรับคำสั่งเหล่านี้ที่จะดำเนินการ document.write (); วิธีการต้องเขียนรหัสไปยัง DOM เพื่อให้มีผล ณ จุดนี้คำขอทั้งหมดและการลงชื่อเข้าใช้ครั้งเดียวสำหรับคำขอ AJAX แบบอะซิงโครนัสได้ถูกนำไปใช้โดยทั่วไปแล้ว
ออกจากบทความนี้เพื่อบันทึกรหัสสำคัญความคิดและหลักการของการดำเนินงาน
สรุป
ข้างต้นคือทั้งหมดที่เกี่ยวกับการใช้งานการลงชื่อเข้าใช้ครั้งเดียวใน SpringMVC Interceptor ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้