อธิบายรายละเอียดเกี่ยวกับกลไกการจัดการของเซสชั่นใน Tomcat:
1. การดำเนินการเซสชันระหว่างกระบวนการร้องขอ:
คำอธิบายสั้น ๆ : ในระหว่างกระบวนการร้องขอให้แยกวิเคราะห์ข้อมูล SessionID เป็นครั้งแรกในคำขอจากนั้นจัดเก็บ SessionID ในรายการพารามิเตอร์ของคำขอ จากนั้นเมื่อคุณได้รับเซสชันจากคำขอหาก SessionID มีอยู่คุณจะได้รับเซสชันจากพูลเซสชันตาม ID หาก SessionID ไม่มีอยู่หรือเซสชันล้มเหลวให้สร้างเซสชันใหม่และใส่ข้อมูลเซสชันลงในพูลเซสชันสำหรับการใช้งานครั้งต่อไป
(1) ไดอะแกรมการแยกช่วงเวลาการแยกวิเคราะห์ SessionID:
ภาพรวม: ก่อนอื่นผู้ใช้จะส่งคำขอ HTTP เพื่อส่งผ่านไปยัง HTTP11Processor จากนั้นส่งผ่านไปยัง CoyoteAdapter ผ่าน HTTP11Processor CoyoteAdapter เป็นอะแดปเตอร์ที่ปรับ org.apache.coyote.request ห่อหุ้มโดยกรอบโคโยตี้เข้ากับ org.apache.catalina.connector.request (ฉันจะไม่พูดมากเกี่ยวกับกระบวนการนี้ซึ่งได้รับการสรุปมาก่อน) หลังจากการแปลงแล้ววิธีการ parsepathparameters จะถูกเรียกให้แยกวิเคราะห์ข้อมูลคุกกี้ในพารามิเตอร์เส้นทาง (เนื่องจากเมื่อคุกกี้ถูกปิดใช้งานโดยเบราว์เซอร์ข้อมูลคุกกี้จะถูกเขียนใหม่ลงใน URL) ก่อนอื่นลองแยกวิเคราะห์ SessionId จาก URL จากนั้น ParsessionCookiesid จะถูกเรียก นี่คือการแยกวิเคราะห์เซสชันจากคุกกี้และเก็บไว้ในคำขอ (วิธีการ parsepathparameters และ parsessioncookiesid ในระหว่างกระบวนการโทรไม่เห็นตรรกะ XOR ที่ชัดเจนนั่นคือทั้งคู่จะถูกดำเนินการ แต่ไม่มีปัญหาใด ๆ ไม่มีปัญหา) การแยกวิเคราะห์ไปยัง SessionID และวางไว้ในคำขอ มันก็โอเคที่จะแยกวิเคราะห์ตรรกะของ SessionID
รหัสคีย์ต่อไปนี้มีการโพสต์:
วิธี ParsepathParameters (แยกวิเคราะห์จาก URL เขียนซ้ำ):
PS: ชิ้นส่วนที่ทำเครื่องหมายไว้คือการแยกแยะตัวแปรจาก URL จากนั้นวางไว้ในรายการพารามิเตอร์คำขอ
ParsesessionCookiesid วิธีการ (การแยกวิเคราะห์เซสชันจากคุกกี้):
PS: แท็กด้านบนคือการรับ SessionID จากคุกกี้ ดูแท็กแรกที่มีการโทรไปยัง SessionConfig.getSessionCookiename (บริบท) ที่นี่คุณจะได้รับคีย์ของเซสชันเริ่มต้น คีย์นี้ถูกกำหนดไว้ใน SessionConfig และค่าของมันคือ JSessionId:
(2) กระบวนการรับเซสชันจากคำขอนั้นเป็นไปตามที่อธิบายไว้ข้างต้น จากนั้นดูที่กระบวนการรับเซสชันใน servlet:
ภาพรวม: AppServlet เป็น servlet ที่เรากำหนดตัวเอง เมื่อเราได้รับเซสชันผ่าน reqest, httpservletrequest (อินเทอร์เฟซ) ที่เรียกว่าจริง ๆ แล้ว RequestFacade (ด้านหน้าที่ห่อหุ้ม org.apache.catalina.connector.request) จากนั้นขอให้เรียกวิธีการ getSession ของคำขอจริง ตรรกะเฉพาะของการร้องขอคือการเรียกใช้วิธี getManger ของคอนเทนเนอร์บริบทเพื่อรับผู้จัดการเซสชัน (รายละเอียดของตัวจัดการเซสชันอธิบายไว้ด้านล่าง) หาก SessionID ถูกแยกวิเคราะห์แล้ววิธีการค้นหาจะถูกเรียกให้ได้รับเซสชันที่สอดคล้องกันจากพูลวัตถุเซสชัน มิฉะนั้นหาก SessionID ไม่มีอยู่เซสชันจะต้องสร้างใหม่และวางไว้ในพูลวัตถุเซสชัน
รหัสคีย์ต่อไปนี้มีการโพสต์:
วิธีการ getSession ของ requestfacade คลาส:
วิธีการ getSession ของการร้องขอคลาส:
วิธี dogetSession ของการร้องขอคลาส:
PS: แท็กแรกคือการรับข้อมูลเซสชันจากพูลวัตถุเซสชันตาม SessionID และแท็กที่สองคือการสร้างวัตถุเซสชันใหม่โดยไม่ต้องแยกวิเคราะห์ SessionID
สิ่งนี้สร้างเซสชันใหม่ จุดนี้เกี่ยวข้องกับการสร้าง SessionID ใหม่ รหัสคีย์โลจิคัลสำหรับการสร้าง SessionID ถูกกำหนดไว้ในวิธีการ generatesessionId ในคลาส SessionId Generator:
ข้างต้นเป็นกระบวนการของเซสชันที่ได้รับ servlet รายละเอียดต่อไปนี้สรุปว่า Tomcat จัดการเซสชันนั่นคือความรู้ของผู้จัดการเซสชัน
2. กลไกการจัดการเซสชัน
คำจำกัดความของตัวจัดการเซสชัน: ส่วนประกอบเซสชันตัวจัดการมีหน้าที่ในการจัดการวัตถุเซสชันเช่นการสร้างและทำลายวัตถุเซสชัน
ก่อนอื่นมาดูแผนภาพโครงสร้างการสืบทอดคลาสของตัวจัดการเซสชัน (นี่คือกราฟของ TOCMAT7.X และกลไกการสืบทอดคลาสของ TOMCAT5 นั้นแตกต่างจากนี้มาก):
คำอธิบายสั้น ๆ : สรุปต่อไปนี้แต่ละหมวดหมู่ (ดูข้อมูลเว็บไซต์อย่างเป็นทางการ):
(1) ผู้จัดการ: กำหนดอินเทอร์เฟซพื้นฐานที่เกี่ยวข้องกับคอนเทนเนอร์บางตัวเพื่อจัดการพูลเซสชัน
(2) ManagerBase: ใช้อินเทอร์เฟซผู้จัดการซึ่งให้การใช้งานฟังก์ชั่นทั่วไปของผู้จัดการเซสชัน
(3) StandardManager: สืบทอดมาจาก ManagerBase ตัวจัดการเซสชันเริ่มต้น (ไม่ระบุการกำหนดค่าใช้สิ่งนี้โดยค่าเริ่มต้น) เป็นการใช้งานที่ไม่ใช่คลัสเตอร์ของเซสชันการประมวลผล TOMCAT (นั่นคือรุ่นสแตนด์อโลน) เมื่อปิด Tomcat ข้อมูลเซสชันหน่วยความจำจะยังคงอยู่ที่ดิสก์และบันทึกเป็นเซสชัน ser และจะถูกกู้คืนเมื่อบูตอีกครั้ง
(4) PresentententManagerbase: สืบทอดมาจาก ManagerBase ใช้และกำหนดฟังก์ชั่นพื้นฐานของการคงอยู่ของผู้จัดการเซสชัน
(5) PresententManager: สืบทอดมาจาก PresentententManagerbase ฟังก์ชั่นหลักคือการแลกเปลี่ยนวัตถุเซสชันที่ไม่ได้ใช้งาน (โดยการตั้งค่าเวลาหมดเวลา) บนดิสก์
(6) ClusterManager: ใช้อินเทอร์เฟซของผู้จัดการและคุณควรถูกเดาด้วยชื่อคลาส นี่คือผู้จัดการที่จัดการเซสชันคลัสเตอร์และผู้จัดการเซสชันของรุ่นสแตนด์อโลน StandardManager ด้านบนเป็นแนวคิดที่สัมพันธ์กัน คลาสนี้กำหนดการจำลองแบบและการแบ่งปันส่วนต่อประสานของเซสชันระหว่างคลาส
(7) ClusterManagerBase: ใช้อินเตอร์เฟส ClusterManager และสืบทอดมาจาก ManagerBase คลาสนี้ใช้การดำเนินการพื้นฐานของการจำลองเซสชัน
(8) BackupManager: สืบทอดมาจาก ClusterManagerBase การดำเนินการตามกลยุทธ์การจำลองแบบเซสชันระหว่างคลัสเตอร์ มีโหนดสำรองข้อมูลเพียงหนึ่งโหนดในข้อมูลเซสชันและโหนดทั้งหมดในคลัสเตอร์สามารถมองเห็นได้ที่ตำแหน่งของโหนดสำรองนี้ การออกแบบนี้ให้ประโยชน์ในการสนับสนุนการปรับใช้ที่ต่างกัน
(9) Deltamanager: สืบทอดมาจาก ClusterManagerBase การใช้กลยุทธ์การจำลองแบบเซสชันคลัสเตอร์ ซึ่งแตกต่างจาก BackupManager ข้อมูลเซสชันจะถูกคัดลอกไปยังโหนดสมาชิกทั้งหมดในคลัสเตอร์ซึ่งกำหนดให้โหนดทั้งหมดในคลัสเตอร์จะต้องเป็น isomorphic และแอปพลิเคชันเดียวกันจะต้องปรับใช้
ภาคผนวก: มาสรุปรายละเอียดด้านล่าง มีร้านค้าตัวแปรสมาชิกในคลาส PresentententManagerbase:
กลยุทธ์การจัดเก็บข้อมูลของตัวจัดการเซสชันถาวรถูกกำหนดโดยวัตถุร้านค้านี้ โครงสร้างการสืบทอดคลาสของร้านนี้มีดังนี้:
คำอธิบายสั้น ๆ : ร้านค้าอินเตอร์เฟสและตัวอย่างมีชุดของกลยุทธ์การจัดเก็บสำหรับผู้จัดการเซสชัน ร้านค้ากำหนดอินเทอร์เฟซพื้นฐานและ storebase ให้การใช้งานพื้นฐาน นโยบายที่ดำเนินการโดยคลาส Filestore คือการจัดเก็บเซสชันในไฟล์ที่ระบุในไดเรกทอรีด้วย setDirectory () และสิ้นสุดด้วย. session คลาส JDBCSTORE จัดเก็บเซสชันลงในฐานข้อมูลผ่าน JDBC ดังนั้นจึงจำเป็นต้องใช้ jdbcstore คุณต้องเรียกเมธอด setDriverName () และเมธอด setConnectionURL () ตามลำดับเพื่อตั้งชื่อชื่อไดรเวอร์และ URL การเชื่อมต่อ
3. การกำหนดค่าที่เกี่ยวข้องกับเซสชัน Tomcat
สรุปการกำหนดค่าและการตั้งค่าที่เกี่ยวข้องกับเซสชันจากสองระดับ ก่อนอื่นจากระดับไฟล์การกำหนดค่าเซสชันมีเวลาหมดอายุและเวลาหมดอายุเริ่มต้นถูกกำหนดไว้ใน $ catalina_home/conf/web.xml การกำหนดค่าเริ่มต้นที่เฉพาะเจาะจงมีดังนี้ (เวลาหมดอายุเริ่มต้นคือ 30 นาทีนั่นคือไม่มีการเข้าถึงใน 30 นาทีและเซสชันจะหมดอายุ):
อีกประเด็นหนึ่งคือหากไม่ได้รับการกำหนดค่าการจัดการเซสชันจะใช้ StandardManager โดยค่าเริ่มต้น อย่างไรก็ตามหากคุณต้องการกำหนดค่าคุณสามารถระบุได้ใน $ catalina_home/conf/context.xml (จากการกำหนดค่านี้คุณจะเห็นว่าตัวจัดการเซสชันเชื่อมโยงกับคอนเทนเนอร์บริบทซึ่งหมายความว่าเว็บแอปพลิเคชันแต่ละตัวจะมีตัวจัดการเซสชัน) การกำหนดค่าเฉพาะมีดังนี้:
Tomcat7.x เริ่มต้นการกำหนดค่าของผู้จัดการนี้ หาก PersistentManager ที่คุณต้องการระบุคือตัวจัดการเริ่มต้นคุณสามารถระบุได้เช่นนี้:
ในความเป็นจริงหลังจากเห็นสิ่งนี้ฉันค้นพบว่าผู้จัดการเซสชันหรือนโยบายการจัดเก็บข้อมูลสามารถปรับแต่งได้ตราบใดที่อินเทอร์เฟซที่เกี่ยวข้องถูกนำไปใช้ สามารถเขียนการกำหนดค่าด้วยตัวเองได้ที่นี่
นอกจากนี้ให้สรุปจากระดับรหัส: ข้อมูลการกำหนดค่าบางอย่างของเซสชันถูกเขียนในรหัสตัวอย่างเช่นคลาส SessionConfig กำหนดข้อมูลการตั้งค่าเซสชันบางอย่าง ชื่อของเซสชั่นในคุกกี้คือ jsession เมื่อเซสชันถูกวางไว้ในเส้นทางผ่านการเขียนใหม่ URL ชื่อของค่าคีย์คือ jsessionids รหัสเฉพาะมีดังนี้:
อีกประเด็นหนึ่งคือความยาวที่ระบุเริ่มต้นของ SessionID คือ 16 ไบต์ซึ่งระบุไว้ใน SessionIdGenerator:
ตกลงมากสรุปเกี่ยวกับการกำหนดค่าเริ่มต้น
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น