سلسلة محاضرات ASP (19) إدارة الجلسات
الكاتب:Eve Cole
وقت التحديث:2009-05-30 19:58:38
أحد تحديات تطوير تطبيقات الويب بنجاح هو الحفاظ على معلومات المستخدم أثناء انتقال المستخدم من صفحة إلى أخرى في التطبيق أثناء زيارة المستخدم أو الجلسة. HTTP هو بروتوكول عديم الحالة، مما يعني أن خادم الويب يعامل كل وصول إلى الصفحة على أنه وصول غير ذي صلة؛ ولا يحتفظ الخادم بأي معلومات حول الوصول السابق، حتى لو حدث الوصول خلال بضعة أيام من الوصول الحالي منذ. هذا النقص في ذاكرة الزيارات السابقة يجعل من الصعب كتابة تطبيقات مثل الكتالوجات عبر الإنترنت، والتي قد تحتاج إلى تتبع عناصر الكتالوج التي حددها المستخدم أثناء التنقل بين صفحات مختلفة من الكتالوج.
يوفر ASP حلاً فريدًا لإدارة مشكلات معلومات الجلسة. باستخدام كائن جلسة ASP ومعرف المستخدم الخاص الذي تم إنشاؤه بواسطة الخادم الخاص بك، يمكنك إنشاء تطبيق ذكي يمكنه التعرف على كل مستخدم وارد وجمع المعلومات التي يستخدمها التطبيق لتتبع تفضيلات المستخدم أو تحديدات المحتوى.
يقوم ASP بتعيين معرف المستخدم من خلال ملفات تعريف الارتباط HTTP. ملفات تعريف الارتباط HTTP هي ملفات صغيرة يتم تخزينها في متصفح المستخدم. ولذلك، إذا كنت تقوم بإنشاء تطبيق لمستعرض لا يدعم ملفات تعريف الارتباط، أو إذا قام عملاؤك بتعيين مستعرضاتهم على عدم قبول ملفات تعريف الارتباط، فلا تستخدم وظيفة إدارة جلسة ASP.
يمكنك أيضًا كتابة البرامج النصية التي يتم تشغيلها عند بدء تشغيل التطبيق أو انتهائه.
بدء الجلسات وإنهاؤها يمكن بدء الجلسات بثلاث طرق:
يطلب مستخدم جديد الوصول إلى URL الذي يعرّف ملف .asp في تطبيق يحتوي ملف Global.asa الخاص به على الإجراء Session_OnStart.
يقوم المستخدم بتخزين قيمة في كائن الجلسة.
يطلب المستخدم ملف .asp الخاص بالتطبيق، ويستخدم ملف Global.asa الخاص بالتطبيق علامة <OBJECT> لإنشاء مثيل للكائن بنطاق جلسة العمل.
إذا لم يطلب المستخدم أو يقوم بتحديث أي صفحة في التطبيق لفترة زمنية محددة، فستنتهي الجلسة تلقائيًا. القيمة الافتراضية لهذه الفترة هي 20 دقيقة. يمكنك تغيير إعداد حد المهلة الافتراضي للتطبيق عن طريق تعيين خاصية "مهلة الجلسة" في صفحة الخصائص "خيارات التطبيق" في Internet Services Manager. يجب تعيين هذه القيمة بناءً على متطلبات تطبيق الويب الخاص بك ومساحة ذاكرة الخادم. على سبيل المثال، إذا كنت تريد أن يظل المستخدمون الذين يتصفحون تطبيق الويب الخاص بك في كل صفحة لبضع دقائق فقط، فيجب عليك تقصير قيمة مهلة الجلسة الافتراضية. ستؤدي قيمة مهلة الجلسة الطويلة جدًا إلى استنفاد موارد ذاكرة الخادم لديك كثيرًا من الجلسات المفتوحة.
بالنسبة لجلسة معينة، إذا كنت تريد تعيين قيمة مهلة أقل من قيمة المهلة الافتراضية، فيمكنك تعيين خاصية المهلة لكائن الجلسة. على سبيل المثال، يقوم البرنامج النصي التالي بتعيين قيمة المهلة إلى 5 دقائق.
<%Session.Timeout = 5%>
يمكنك أيضًا تعيين قيمة مهلة أكبر من الإعداد الافتراضي. تحدد الخاصية Session.Timeout قيمة المهلة.
يمكنك أيضًا إنهاء الجلسة بشكل صريح من خلال أسلوب Abandon الخاص بكائن الجلسة. على سبيل المثال، لتوفير زر إنهاء في جدول، قم بتعيين معلمة ACTION للزر إلى URL لملف .asp الذي يحتوي على الأمر التالي.
<% جلسة.التخلي %>
حول معرف الجلسة وملفات تعريف الارتباط
عندما يطلب مستخدم ملف .asp لأول مرة في تطبيق معين، يقوم ASP بإنشاء معرف الجلسة. معرف الجلسة هو رقم تم إنشاؤه بواسطة خوارزمية معقدة تحدد كل جلسة مستخدم بشكل فريد. في بداية الجلسة الجديدة، يقوم الخادم بتخزين معرف الجلسة كملف تعريف ارتباط في متصفح الويب الخاص بالمستخدم.
يشبه SessionID إلى حد كبير المفتاح حيث يمكن لـ ASP تخزين معلومات المستخدم في "خزنة" على الخادم عندما يتفاعل المستخدم مع التطبيق أثناء الجلسة. مثلما يمكن استخدام المفتاح للوصول إلى العناصر الموجودة في الخزنة، يمكن الوصول إلى محتويات "الخزنة" من خلال ملف تعريف ارتباط SessionID الخاص بالمستخدم الذي يتم إرساله في رأس طلب HTTP. عندما يتلقى ASP طلب صفحة، فإنه يتحقق من رأس طلب HTTP للحصول على ملف تعريف الارتباط SessionID.
بعد تخزين ملف تعريف الارتباط SessionID في مستعرض المستخدم، يستمر ASP في إعادة استخدام ملف تعريف الارتباط لتعقب الجلسة حتى إذا طلب المستخدم ملف .asp آخر، أو طلب ملف .asp قيد التشغيل في تطبيق آخر. وبالمثل، إذا تخلى المستخدم عن جلسة العمل عن قصد أو سمح لها بانتهاء مهلة الجلسة، ثم طلب ملف .asp آخر، فسيبدأ ASP جلسة عمل جديدة بنفس ملف تعريف الارتباط. فقط عندما يقوم مسؤول الخادم بإعادة تشغيل الخادم أو يقوم المستخدم بإعادة تشغيل مستعرض الويب، سيتم مسح إعدادات SessionID المخزنة في الذاكرة وسيحصل المستخدم على ملف تعريف ارتباط SessionID جديد.
من خلال إعادة استخدام ملف تعريف الارتباط SessionID، يقوم ASP بتقليل عدد ملفات تعريف الارتباط المرسلة إلى مستعرض المستخدم. وبدلاً من ذلك، إذا قررت أن تطبيق ASP الخاص بك لا يتطلب إدارة الجلسة، فيمكنك منع ASP من تعقب جلسات العمل وإرسال معرفات الجلسة إلى المستخدمين.
لا يرسل ASP ملفات تعريف الارتباط للجلسة في الحالات التالية:
تم تعطيل حالة جلسة التطبيق.
يتم تعريف صفحة ASP على أنها بدون جلسة، أي أن الصفحة تحتوي على العلامة <%@ EnableSessionState=False %>.
يرجى ملاحظة أن ملف تعريف الارتباط SessionID لا يوفر طريقة دائمة لتتبع المستخدم عبر زيارات متعددة لموقع ويب. يمكن بسهولة فقدان معلومات معرف الجلسة المخزنة في ذاكرة الخادم. إذا كنت تريد تعقب المستخدمين الذين يزورون تطبيق الويب الخاص بك بمرور الوقت، فيجب عليك إنشاء هوية مستخدم عن طريق تخزين ملف تعريف ارتباط خاص في مستعرض الويب الخاص بالمستخدم وحفظ معلومات ملف تعريف الارتباط في قاعدة بيانات.
تخزين البيانات في كائن الجلسة
يوفر كائن الجلسة مصفوفة ترابطية ديناميكية يمكن تخزين المعلومات فيها. يمكنك تخزين المتغيرات الرقمية ومتغيرات الكائنات في كائنات الجلسة.
يمكن تخزين المتغيرات في كائن الجلسة عن طريق تعيين قيم للعناصر المسماة في كائن الجلسة. على سبيل المثال، يقوم الأمر التالي بتخزين متغيرين جديدين في كائن الجلسة:
<%
الجلسة ("الاسم الأول") = "جيف"
الجلسة ("اسم العائلة") = "سميث"
%>
يمكن الحصول على المعلومات من كائن الجلسة عن طريق الوصول إلى هذا العنصر المسمى. على سبيل المثال، اعرض القيمة الحالية للجلسة ("الاسم الأول"):
مرحبًا <%= جلسة ("الاسم الأول") %>
يمكنك تخزين تفضيلات المستخدم في كائن الجلسة ثم الوصول إلى التفضيلات لتحديد الصفحة التي سيتم إرسالها إلى المستخدم. على سبيل المثال، يمكنك السماح للمستخدمين بتحديد إصدار نصي فقط من المحتوى في الصفحة الأولى من التطبيق الخاص بك وتطبيق هذا التحديد على جميع الصفحات اللاحقة من التطبيق التي يزورها المستخدم.
<% إذا كانت الجلسة("ScreenResolution") = "منخفضة" ثم %>
هذه هي النسخة النصية للصفحة.
<%آخر%>
هذه هي نسخة الوسائط المتعددة للصفحة.
<% نهاية إذا %>
يمكنك أيضًا تخزين مثيل كائن في كائن الجلسة، لكن القيام بذلك سيؤثر على أداء الخادم.
إدارة جلسات مزرعة الويب
يتم تخزين معلومات جلسة ASP في خادم الويب. يجب أن يطلب المتصفح صفحة من خادم الويب للحصول على البرنامج النصي المستخدم للوصول إلى معلومات الجلسة. في مزرعة الويب (حيث تتقاسم العديد من خوادم الويب مسؤولية الاستجابة لطلبات المستخدم)، لا يتم توجيه طلبات المستخدم دائمًا إلى نفس الخادم، بل إلى عنوان URL بواسطة برنامج خاص يسمى عملية "موازنة التحميل" الخاصة بالموقع يتم تعيينه إلى أي خادم مجاني. تجعل عملية موازنة التحميل من الصعب الحفاظ على معلومات الجلسة في Web Farm.
لاستخدام إدارة جلسة ASP على موقع متوازن التحميل، يجب عليك التأكد من توجيه كافة طلبات جلسة المستخدم إلى نفس خادم الويب. تتمثل إحدى الطرق في كتابة إجراء Session_OnStart الذي يستخدم كائن استجابة لإعادة توجيه المتصفح إلى خادم الويب الذي يقوم بتشغيل جلسة المستخدم. إذا كانت جميع الروابط الموجودة في صفحات تطبيقك مرتبطة، فسيتم توجيه جميع الطلبات المستقبلية للصفحة إلى نفس الخادم.
على سبيل المثال، يريد المستخدم الوصول إلى أحد التطبيقات عن طريق طلب عنوان URL العام للموقع: http://www.microsoft.com. تقوم عملية موازنة التحميل بتوجيه الطلبات إلى الخادم server3.microsoft.com. قام ASP بإنشاء جلسة مستخدم جديدة على هذا الخادم. أثناء عملية Session_OnStart، تتم إعادة توجيه المتصفح إلى الخادم المحدد:
<% Response.Redirect("http://server3.microsoft.com/webapps/firstpage.asp") %>
سيطلب المتصفح الصفحة المحددة، وسيتم توجيه جميع الطلبات المستقبلية إلى نفس الخادم.
استخدم ملفات تعريف الارتباط
ملف تعريف الارتباط هو رمز مميز يقوم خادم الويب بتضمينه في متصفح الويب الخاص بالمستخدم لتمثيل المستخدم. في المرة التالية التي يطلب فيها نفس المتصفح صفحة، فإنه سيرسل ملف تعريف الارتباط المستلم من خادم الويب. يسمح ملف تعريف الارتباط بربط مجموعة من المعلومات بالمستخدم. تستخدم البرامج النصية لـ ASP مجموعة ملفات تعريف الارتباط لكائنات الاستجابة والطلب للحصول على قيم ملفات تعريف الارتباط وتعيينها.
تعيين ملفات تعريف الارتباط
لتعيين قيمة ملف تعريف الارتباط، استخدم Response.Cookies. إذا لم يكن ملف تعريف الارتباط موجودًا، فسيقوم Response.Cookies بإنشاء ملف تعريف ارتباط جديد. على سبيل المثال، لإرسال اسم ملف تعريف الارتباط ("الكوكب") مع قيمة مرتبطة ("المريخ") إلى المتصفح، استخدم الأوامر التالية، والتي يجب أن تظهر قبل علامة <HTML> لصفحة الويب الخاصة بك:
<% Response.Cookies("planet")="المريخ" %>
إذا كنت تريد استخدام ملف تعريف الارتباط فقط أثناء جلسة المستخدم الحالية، فما عليك سوى إرسال ملف تعريف الارتباط إلى المتصفح. ومع ذلك، إذا كنت تريد التعرف على المستخدم بعد إنهاء المتصفح أو إعادة تشغيله، فيجب عليك إجبار المتصفح على تخزين ملف تعريف الارتباط على القرص الصلب بجهاز الكمبيوتر. لحفظ ملف تعريف الارتباط، استخدم خاصية انتهاء الصلاحية في Response.Cookies وقم بتعيين التاريخ إلى يوم في المستقبل:
<%
Response.Cookies("الكوكب") = "المريخ"
Response.Cookies("الكوكب").انتهاء الصلاحية = "1 يناير 1999"
%>
يمكن أن يحتوي ملف تعريف الارتباط على قيم متعددة؛ ويسمى ملف تعريف الارتباط هذا بملف تعريف الارتباط المفهرس. يتم تعيين كلمة رئيسية لكل قيمة ملف تعريف ارتباط، ويمكنك تعيين قيمة كلمة رئيسية محددة لملف تعريف الارتباط. على سبيل المثال:
<% Response.Cookies("planet")("Mars")="SpaceMissions" %>
إذا كان ملف تعريف الارتباط الموجود يحتوي على قيمة كلمة أساسية ولكن Response.Cookies لا يحدد اسم الكلمة الأساسية، فسيتم حذف قيمة الكلمة الأساسية. وبالمثل، إذا كان ملف تعريف الارتباط الموجود لا يحتوي على قيمة كلمة رئيسية ولكن Response.Cookies يحدد اسم وقيمة الكلمة الأساسية، فسيتم حذف قيمة ملف تعريف الارتباط الحالي وسيتم إنشاء زوج جديد من قيمة المفتاح.
احصل على ملفات تعريف الارتباط
للحصول على قيمة ملف تعريف الارتباط، استخدم مجموعة Request.Cookies. على سبيل المثال، إذا قام طلب HTTP الخاص بالمستخدم بتعيين Planet=Mars، فستحصل العبارة التالية على القيمة Mars:
<%= Request.Cookies("الكوكب") %>
وبالمثل، للحصول على قيمة الكلمة الرئيسية من ملف تعريف الارتباط المفهرس، استخدم اسم الكلمة الأساسية. على سبيل المثال، إذا قام المستخدم بتقديم طلب HTTP التالي:
Planet=Mars&Mars=SpaceMissions
سيقوم البرنامج النصي التالي بإرجاع القيمة SpaceMissions:
<%= Request.Cookies("الكوكب")("المريخ") %>
تعيين مسار ملف تعريف الارتباط يحتوي كل ملف تعريف ارتباط يتم تخزينه بواسطة ASP في مستعرض الويب الخاص بالمستخدم على معلومات المسار. عندما يطلب المتصفح ملفًا موقعه هو نفس المسار المحدد في ملف تعريف الارتباط، يقوم المتصفح تلقائيًا بإعادة توجيه ملف تعريف الارتباط إلى الخادم. بشكل افتراضي، يتوافق مسار ملف تعريف الارتباط مع اسم التطبيق الذي يحتوي على ملف .asp الذي أنشأ ملف تعريف الارتباط في الأصل. على سبيل المثال، إذا قام ملف .asp في تطبيق يسمى UserApplication بإنشاء ملف تعريف ارتباط، ففي كل مرة يقوم مستعرض الويب الخاص بالمستخدم باسترداد الملف في هذا التطبيق، تتم أيضًا إعادة توجيه ملف تعريف الارتباط هذا إلى الخادم.
لتعريف مسار لملف تعريف الارتباط يختلف عن مسار التطبيق الافتراضي، استخدم خاصية المسار لمجموعة Response.Cookies الخاصة بـ ASP. على سبيل المثال، يقوم البرنامج النصي التالي بتعيين المسار SalesApp/Customer/Profiles/ لملف تعريف الارتباط المسمى المشتريات:
<%
Response.Cookies("المشتريات") = "12"
Response.Cookies("المشتريات").انتهاء الصلاحية = "1 يناير 2001"
Response.Cookies("المشتريات").Path = "/SalesApp/Customer/Profiles/"
%>
عندما يطلب متصفح الويب الذي يحتوي على ملف تعريف ارتباط المشتريات ملفًا موجودًا في المسار /SalesApp/Customer/Profiles/ أو الدلائل الفرعية الخاصة به، يقوم المتصفح بإعادة توجيه ملف تعريف الارتباط إلى الخادم.
تحافظ العديد من متصفحات الويب، بما في ذلك متصفحات Microsoft Internet Explorer 4.0 وNetscape، على حالة مسارات ملفات تعريف الارتباط. أي أنه إذا كانت حالة الملف المطلوب مختلفة عن مسار ملف تعريف الارتباط المحجوز، فلن يقوم المتصفح بإعادة توجيه ملف تعريف الارتباط إلى الخادم. على سبيل المثال، بالنسبة لـ ASP، فإن الدلائل الافتراضية /TRAVEL و/travel هي نفس تطبيق ASP، ولكن بالنسبة للمتصفحات التي تحافظ على حالة عنوان URL، فإن /TRAVEL و/travel هما تطبيقان مختلفان. يجب عليك التأكد من أن كافة عناوين URL إلى الملف .asp لها نفس الحالة للتأكد من أن مستعرض المستخدم يمكنه إعادة توجيه ملف تعريف الارتباط المخزن.
إذا رغبت في ذلك، يمكنك استخدام العبارة التالية لتعيين مسار ملف تعريف الارتباط بحيث تتم إعادة توجيه ملف تعريف الارتباط عندما يطلب متصفح الويب الخاص بالمستخدم ملفًا من الخادم الخاص بك، بغض النظر عن التطبيق أو المسار:
Response.Cookies("المشتريات").Path = "/"
ومع ذلك، يرجى ملاحظة أن إرسال ملفات تعريف الارتباط إلى الخادم دون التمييز بين التطبيقات قد يخلق مشكلات أمنية إذا كان ملف تعريف الارتباط يحتوي على معلومات حساسة لا ينبغي الوصول إليها بواسطة برامج أخرى غير التطبيق المعين.
الحفاظ على الحالة دون استخدام ملفات تعريف الارتباط لا تدعم جميع المتصفحات ملفات تعريف الارتباط. حتى عند استخدام متصفح يدعم ملفات تعريف الارتباط، قد يفضل بعض المستخدمين إيقاف تشغيل دعم ملفات تعريف الارتباط. إذا كان التطبيق الخاص بك يحتاج إلى الاستجابة للمتصفحات التي لا تدعم ملفات تعريف الارتباط، فيجب عليك استخدام إدارة جلسة ASP.
إذا كنت لا تستخدم إدارة جلسة ASP، فيجب عليك كتابة الآلية الخاصة بك لتمرير المعلومات بين صفحات التطبيق الخاص بك. هناك طريقتان عامتان لإنجاز هذه المهمة:
أضف معلمات إلى سلسلة استعلام عنوان URL. على سبيل المثال:
http://MyServer/MyApp/start.asp?name=Jeff
ومع ذلك، ستتجاهل بعض المتصفحات المعلمات الصريحة التي تم تمريرها في سلسلة الاستعلام عند إرسال النموذج باستخدام أسلوب GET.
أضف القيم المخفية إلى الجدول. على سبيل المثال، يحتوي جدول HTML التالي على عنصر تحكم ضمني. لا يظهر عنصر التحكم هذا بالشكل الفعلي ولا يكون مرئيًا لمتصفح الويب الخاص بالمستخدم. من خلال طريقة HTTP POST، يقوم النموذج بتمرير معرف المستخدم بالإضافة إلى المعلومات المقدمة من قبل المستخدم.
<طريقة النموذج = "POST" ACTION = "/scripts/inform.asp">
<نوع الإدخال = "نص" NAME = "المدينة" VALUE = "">
<نوع الإدخال = "نص" NAME = "البلد" VALUE = "">
<INPUT TYPE="hidden" NAME="userid" VALUE= <%=UserIDNum(i) %>
<نوع الإدخال = "إرسال" VALUE = "أدخل">
تتطلب هذه الطريقة تشفير كافة أهداف الارتباط التي تنقل معلومات المستخدم كجداول HTML.
إذا كنت لا تستخدم حاليًا إدارة جلسة ASP، فقم بإيقاف تشغيل دعم الجلسة للتطبيق الخاص بك. عند تمكين جلسة عمل، يرسل ASP ملف تعريف الارتباط SessionID إلى كل متصفح يطلب صفحة ASP. لإيقاف تشغيل دعم الجلسة، قم بإلغاء تحديد خانة الاختيار تمكين حالة الجلسة في صفحة خصائص خيارات التطبيق في Internet Services Manager.
صفحة ASP بدون جلسة
يوفر ASP أيضًا القدرة على إنشاء صفحات بدون جلسة، والتي يمكنك استخدامها لتأجيل إنشاء الجلسة حتى يصل المستخدم إلى صفحة ASP التي تتطلب تتبع الجلسة.
لا تؤدي الصفحات بدون جلسات الوظائف التالية:
قم بتنفيذ الإجراء Session_OnStart.
إرسال ملف تعريف ارتباط معرف الجلسة.
إنشاء كائن الجلسة.
قم بالوصول إلى كائنات الجلسة المضمنة أو كائنات نطاق الجلسة التي تم إنشاؤها باستخدام علامة <OBJECT>.
يتم تنفيذه بالتسلسل مع طلبات الجلسة الأخرى.
لتكوين .asp ليكون بدون جلسة، استخدم العبارة التالية:
<%@ EnableSessionState=False %>
يجب وضع هذا البرنامج النصي على السطر الأول من الملف .asp، قبل البرامج النصية الأخرى. افتراضيًا، إذا تم حذف هذه العلامة، فسيتم تمكين تتبع الجلسة.
تعمل صفحات ASP بدون جلسات على تحسين أداء استجابة الخادم من خلال التخلص من عمليات الجلسة التي قد تستغرق وقتًا طويلاً. على سبيل المثال، خذ بعين الاعتبار الموقف التالي: تحتوي صفحة ASP على إطارين HTML، الإطار 1 والإطار 2، في مجموعة إطارات. يحتوي الإطار 1 على ملف .asp الذي ينفذ برنامج نصي معقد، بينما يحتوي الإطار 2 على ملف .html بسيط. نظرًا لأن ASP ينفذ طلبات الجلسة بشكل تسلسلي (أي بشكل تسلسلي)، فلن ترى محتويات الإطار 2 حتى يتم تنفيذ البرنامج النصي للإطار 1. ومع ذلك، إذا قمت بتعيين الإطار 1 على وضع عدم الجلسة، فلن تتم معالجة طلب ASP بشكل تسلسلي، ولا يتعين على المستعرض الانتظار حتى انتهاء تنفيذ محتوى الإطار 1 قبل أن يتمكن من معالجة محتوى الإطار 2.
ومع ذلك، فإن كيفية التعامل مع الطلبات المتعددة لإطارات مختلفة تعتمد في النهاية على تكوين متصفح الويب الخاص بالمستخدم. قد تتجاهل بعض متصفحات الويب التكوين بدون جلسة لملف .asp الخاص بك وتستمر في معالجة الطلبات بشكل تسلسلي.