วิธีดูแลรักษา Session: บางคนบอกให้ set session.timeout=-1 หรือตัวเลขที่น้อยกว่า 0 วิธีนี้จะเป็นไปไม่ได้อย่างแน่นอน เวลาในการคำนวณเซสชันเป็นนาทีและต้องเป็นจำนวนเต็มที่มากกว่าหรือเท่ากับ 1 มีคนอื่นบอกให้ตั้งค่า session.timeout=99999 วิธีนี้ใช้ไม่ได้เช่นกัน เซสชันมีการจำกัดเวลาสูงสุด ทดสอบแล้วพบว่าค่าสูงสุดคือ 24 ชั่วโมง แปลว่าสูงสุดได้คือ session.timeout=1440 และไม่อนุญาตให้ใช้ 1441 555 สภาพแวดล้อมการทดสอบของฉัน: win2003+IIS6.0+ASP3.0
ดังนั้นจึงเป็นไปไม่ได้ที่จะทำให้เซสชันไม่มีวันหมดอายุโดยการตั้งค่าเวลาหมดอายุของ session.timeout การเขียนลงในคุกกี้เป็นวิธีการที่ดีกว่า มีบทช่วยสอนมากมายบนอินเทอร์เน็ต ดังนั้นฉันจะไม่เข้าไปดูที่นี่! อีกวิธีหนึ่งคือการตั้งค่า iframe ที่ซ่อนอยู่ในเพจที่จะรักษาเซสชันไว้เป็นระยะ ๆ (เวลานี้น้อยกว่าเวลาหมดเวลาของเซสชัน) ให้รีเฟรชเพจว่างในเฟรม! วิธีการดำเนินการมีดังนี้:
เพิ่มสิ่งต่อไปนี้ลงในหน้าเซสชันที่คุณต้องการเก็บไว้:
คัดลอกรหัสรหัสดังต่อไปนี้:
<ความกว้าง iframe=0 ความสูง=0 src=/blog/SessionKeeper.asp></iframe>
สร้างไฟล์ SessionKeeper.asp ในไดเร็กทอรีเดียวกัน รหัส XML/HTMLCopy
คัดลอกรหัสรหัสดังต่อไปนี้:
<html>
<หัว>
<meta http-equiv=รีเฟรชเนื้อหา=900000;url=sessionKeeper.asp>
<!--รีเฟรชตัวเองทุกๆ 900 วินาทีเพื่อสื่อสารกับเซิร์ฟเวอร์และป้องกันไม่ให้เซสชั่นสูญหาย-->
</หัว>
</html>
วิธีนี้เป็นวิธีที่ค่อนข้างธรรมดา และมีอีกวิธีหนึ่งที่คล้ายกับที่กล่าวมาข้างต้น แต่ไม่ได้ใช้เมตาเพื่อรีเฟรช iframe ที่ซ้อนกันโดยอัตโนมัติ เขาใช้ javascript:window.setTimeout(functionname(),10000); เพื่อเรียกใช้ฟังก์ชันตามช่วงเวลาโดยอัตโนมัติ วิธีการเฉพาะมีดังนี้:
เพิ่ม: คัดลอกโค้ด JavaScript ไปยังเซสชันที่จะคงไว้
คัดลอกรหัสรหัสดังต่อไปนี้:
<script id=ภาษาด้านหลัง=javascript></script>
<ภาษาสคริปต์=จาวาสคริปต์>
ฟังก์ชั่นการเก็บรักษา () {
document.all[กลับ].src=/blog/SessionKeeper.asp?RandStr=+Math.random();
//RandStr=Math.random ที่นี่เพียงเพื่อทำให้ค่าของ back.src แตกต่างกันในแต่ละครั้ง เพื่อป้องกันไม่ให้การรีเฟรชที่อยู่เดียวกันไม่ถูกต้อง
window.setTimeout(keepsession(),900000); //เรียกตัวเองทุกๆ 900 วินาที
-
ความทรงจำ();
</script>ด้วยวิธีนี้ เพียงสร้างไฟล์ sessionKeeper.asp ที่มีเนื้อหาว่างในไดเร็กทอรีเดียวกัน!
ปัญหาไม่ได้รับการแก้ไข: ไม่น่าจะมีปัญหากับการรักษาเซสชันด้วยวิธีข้างต้น ค่าเริ่มต้นของ IIS สำหรับการล้างเซสชันโดยไม่ต้องร้องขอคือ 20 นาที เวลาที่ฉันตั้งไว้สำหรับบริการเชิงโต้ตอบแต่ละรายการนั้นน้อยกว่าค่านี้มาก แต่สำหรับฉันใช้เวลาประมาณหนึ่งวัน หลังจากผ่านไปนาน เซสชั่นก็ยังคงหายไปโดยไม่มีเหตุผล! หดหู่.
ต่อมา ฉันค้นหาหลายแห่งบนอินเทอร์เน็ตและในที่สุดก็พบคำตอบ: ปรากฎว่าเพื่อปกป้องเซิร์ฟเวอร์ IIS มีแนวคิดในการรีไซเคิล! หลังจากทดสอบมาเป็นเวลานาน ในที่สุดฉันก็เข้าใจโดยทั่วไป (อย่าหัวเราะเยาะฉันนะ^-^) ก่อนอื่นเรามาดูกันว่าการรีไซเคิลนี้เกิดขึ้นที่ใด
เริ่ม IIS Manager->Application Pool->คลิกขวา->Properties->แท็บ Recycle 29 ชม. เขาหมายถึงอะไร? ความเข้าใจส่วนตัวของฉัน: เซสชันที่กำลังดำเนินอยู่ทั้งหมดจะถูกล้างโดยอัตโนมัติ 1,740 นาทีหลังจากเซสชันหมดเวลา ค่านี้สามารถตั้งค่าได้สูงสุด 4,000,000 ซึ่งก็คือมากกว่า 2,700 วันโดยประมาณ! ฉันยกเลิกมันโดยตรงโดยไม่มีเขารีไซเคิลโดยอัตโนมัติ! ในที่สุดปัญหาก็ได้รับการแก้ไข
นอกจากนี้ ยังมีรายการอื่นๆ หลายรายการในกล่องโต้ตอบคุณสมบัตินี้:
รายการที่สองควรรีไซเคิลเมื่อจำนวนผู้ใช้ที่เชื่อมต่อเกินจำนวนที่กำหนด
ประการที่ 3 คือการรีไซเคิลโดยอัตโนมัติเมื่อถึงเวลาที่กำหนด
ในแท็บประสิทธิภาพ ปิดกระบวนการของผู้ปฏิบัติงานหลังจากไม่ได้ใช้งานในช่วงเวลานี้ นี่คือที่ที่ตั้งเวลาเซสชันเริ่มต้นของ IIS ค่าเริ่มต้นคือ 20 นาที ค่าสูงสุดที่นี่สามารถตั้งค่าเป็น 4000000 ซึ่งแตกต่างจากการตั้งค่าสูงสุดของ session.timeout เป็น 1440 ในหน้า ASP ฉันยังไม่ได้ทดสอบว่าการตั้งค่าที่มากกว่า 1440 ที่นี่จะใช้งานได้หรือไม่ เหตุใดค่าสูงสุดของ session.timeout ในหน้า ASP จึงมีค่าเพียง 1440 แต่สามารถตั้งค่าได้มากในคุณสมบัติของ IIS ควรเป็นกลไกการป้องกัน: ผู้ใช้สามารถตั้งค่า session.timeout บนเพจ ASP ได้ แต่มีเพียงผู้ดูแลระบบเท่านั้นที่สามารถตั้งค่าใน IIS ได้ ทั้งสองมีสิทธิ์ที่แตกต่างกัน ดังนั้นช่วงการตั้งค่าจึงแตกต่างกัน