طريقة الحفاظ على الجلسة: يقول بعض الأشخاص بتعيين session.timeout=-1، أو رقم أقل من 0. هذه الطريقة غير ممكنة بالتأكيد، وقت حساب الجلسة بالدقائق ويجب أن يكون عددًا صحيحًا أكبر من أو يساوي 1. قال شخص آخر لتعيين session.timeout=99999. هذا لا يعمل أيضًا، فالجلسة لها حد أقصى للوقت. وبعد الاختبار وجدت أن الحد الأقصى للقيمة هو 24 ساعة، مما يعني أن الحد الأقصى الذي يمكنك الحصول عليه هو session.timeout=1440، ولا يسمح بـ 1441، هاها. بيئة الاختبار الخاصة بي: win2003+IIS6.0+ASP3.0.
لذلك، من المستحيل جعل الجلسة لا تنتهي أبدًا عن طريق تعيين وقت انتهاء الصلاحية لـ session.timeout. تعد الكتابة في ملفات تعريف الارتباط طريقة أفضل. هناك العديد من هذه البرامج التعليمية على الإنترنت، لذا لن أخوض فيها هنا! هناك طريقة أخرى تتمثل في إعداد إطار iframe مخفي في الصفحة التي سيتم الاحتفاظ بالجلسة فيها من حين لآخر (هذه المرة أقل من وقت انتهاء الجلسة)، ثم قم بتحديث الصفحة الفارغة في الإطار! طريقة التنفيذ هي كما يلي:
أضف ما يلي إلى صفحة الجلسة حيث تريد الاحتفاظ بها:
انسخ رمز الكود كما يلي:
<iframe width=0 height=0 src=/blog/SessionKeeper.asp></iframe>
قم بإنشاء الملف SessionKeeper.asp في نفس الدليل. كود XML/HTMLنسخ
انسخ رمز الكود كما يلي:
<أتش تي أم أل>
<الرأس>
<meta http-equiv=تحديث المحتوى=900000;url=sessionKeeper.asp>
<!--قم بتحديث نفسك كل 900 ثانية لتتواصل مع الخادم وتحافظ على الجلسة من الضياع-->
</الرأس>
</html>
هذه الطريقة شائعة نسبيًا، وهناك طريقة أخرى مشابهة لما ورد أعلاه، ولكنها لا تستخدم التعريف لتحديث إطارات iframe المتداخلة تلقائيًا. يستخدم javascript:window.setTimeout(functionname(),10000); لاستدعاء وظيفة تلقائيًا على فترات زمنية. الطريقة المحددة هي كما يلي:
إضافة: نسخ كود جافا سكريبت إلى الجلسة المراد صيانتها
انسخ رمز الكود كما يلي:
<script id=Back language=javascript></script>
<لغة البرنامج النصي=جافا سكريبت>
وظيفة الاحتفاظ بالجلسة () {
document.all[Back].src=/blog/SessionKeeper.asp?RandStr=+Math.random();
// RandStr=Math.random هنا فقط لجعل قيمة back.src مختلفة في كل مرة لمنع تحديث نفس العنوان من أن يكون غير صالح.
window.setTimeout(keepsession(),900000); // الاتصال بنفسه كل 900 ثانية
}
Keepession();
</script>وبهذه الطريقة، ما عليك سوى إنشاء ملف sessionKeeper.asp بمحتوى فارغ في نفس الدليل!
لم يتم حل المشكلة: يجب ألا تكون هناك مشكلة في الحفاظ على الجلسة من خلال الطريقة المذكورة أعلاه. القيمة الافتراضية لـ IIS لمسح الجلسة دون طلب هي 20 دقيقة، والوقت الذي أقوم بتعيينه لكل خدمة تفاعلية أقل بكثير من هذه القيمة. لكن الأمر يستغرق حوالي يوم بالنسبة لي، وبعد مرور وقت طويل، لا تزال الجلسة تختفي بدون سبب! محبَط.
لاحقًا، بحثت في العديد من الأماكن على الإنترنت ووجدت الإجابة أخيرًا: اتضح أنه من أجل حماية الخادم، لدى IIS مفهوم إعادة التدوير! بعد الاختبار لفترة طويلة، حصلت أخيرًا على فهم عام (لا تضحك علي ^-^). دعونا أولاً نلقي نظرة على مكان إعداد عملية إعادة التدوير هذه.
ابدأ مدير IIS-> تجمع التطبيقات-> انقر بزر الماوس الأيمن->خصائص->علامة التبويب "إعادة التدوير". يوجد عنصر واحد يعمل بشكل افتراضي، وهو العنصر الأول: عملية إعادة التدوير (الدقائق). القيمة الافتراضية هي 1740 دقيقة 29 ساعة. ماذا يعني؟ ما أفهمه شخصيًا: سيتم مسح جميع الجلسات الجارية تلقائيًا بعد 1740 دقيقة من انتهاء الجلسة. يمكن ضبط هذه القيمة على 4,000,000 كحد أقصى، أي ما يزيد عن 2,700 يوم تقريبًا! لقد ألغيته مباشرة دون أن يقوم بإعادة تدويره تلقائيًا! تم حل المشكلة أخيرا.
بالإضافة إلى ذلك، هناك العديد من العناصر الأخرى في مربع حوار الخصائص هذا:
أما العنصر الثاني فيجب إعادة تدويره عندما يتجاوز عدد المستخدمين المتصلين عدداً معيناً.
العنصر الثالث هو إعادة تدويره تلقائيًا في وقت معين.
في علامة التبويب "الأداء"، قم بإيقاف تشغيل العملية المنفذة بعد أن تكون خاملة لهذه الفترة الزمنية، وهذا هو المكان الذي يتم فيه تعيين وقت جلسة العمل الافتراضي لـ IIS. القيمة الافتراضية هي 20 دقيقة ويمكن أيضًا تعيين الحد الأقصى للقيمة هنا إلى 4000000، وهو ما يختلف عن تعيين الحد الأقصى لقيمة session.timeout إلى 1440 في صفحة ASP. لم أختبر ما إذا كان تعيين قيمة أكبر من 1440 هنا سيعمل أم لا، وأعتقد أنه سيكون ممكنًا. فلماذا يمكن أن تكون القيمة القصوى لـ session.timeout في صفحة ASP هي 1440 فقط، ولكن يمكن تعيينها كبيرة جدًا في خصائص IIS؟ يجب أن تكون آلية حماية: يمكن لأي مستخدم تعيين قيمة session.timeout على صفحة ASP، ولكن يمكن للمسؤول فقط تعيينها في IIS. ولكل منهما أذونات مختلفة، وبالتالي فإن نطاق الإعداد مختلف.