HTTP هو بروتوكول عديم الحالة، مما يعني أنه في كل مرة يسترد فيها العميل صفحة ويب، يتم فتح اتصال خادم منفصل، لذلك لا يسجل الخادم أي معلومات من طلبات العميل السابقة.
هناك ثلاث طرق للحفاظ على جلسة خادم العميل:
يمكن لخادم الويب تعيين معرف جلسة فريد كملف تعريف ارتباط لتمثيل كل عميل وتحديد الطلبات اللاحقة من هذا العميل.
قد لا تكون هذه طريقة فعالة، لأن المتصفحات في كثير من الأحيان لا تدعم ملفات تعريف الارتباط بالضرورة، لذلك لا نوصي باستخدام هذه الطريقة للحفاظ على الجلسة.
يمكن لخادم الويب إرسال حقل نموذج HTML مخفي ومعرف جلسة فريد، مثل هذا:
<نوع الإدخال = "مخفي" اسم = "معرف الجلسة" القيمة = "12345">
يعني هذا الإدخال أنه عند إرسال النموذج، سيتم تضمين الاسم والقيمة المحددين تلقائيًا في بيانات GET أو POST. عندما يرسل المتصفح طلبًا، يمكن استخدام قيمة session_id لحفظ آثار المتصفحات المختلفة.
قد يكون هذا الأسلوب أسلوبًا فعالاً، ولكن النقر فوق ارتباط تشعبي في علامة <A HREF> لا يؤدي إلى إنشاء حدث إرسال نموذج، لذا فإن حقول النموذج المخفية لا تدعم تتبع الجلسة العامة.
يمكنك إضافة بعض البيانات الإضافية بعد كل عنوان URL لتمييز الجلسة، ويمكن للخادم ربط معرف الجلسة بناءً على هذه البيانات.
على سبيل المثال، http://w3cschool.cn/file.htm;sessionid=12345، معرف الجلسة هو sessionid=12345، يمكن للخادم استخدام هذه البيانات لتحديد العميل.
وبالمقارنة، فإن إعادة كتابة عنوان URL هي طريقة أفضل، وستعمل حتى لو كان المتصفح لا يدعم ملفات تعريف الارتباط، ولكن العيب هو أنه يجب عليك تحديد معرف الجلسة ديناميكيًا لكل عنوان URL، حتى لو كانت صفحة HTML بسيطة.
بالإضافة إلى الطرق المذكورة أعلاه، يستخدم JSP واجهة HttpSession التي يوفرها servlet لتحديد المستخدم وتخزين جميع معلومات الوصول الخاصة بهذا المستخدم.
افتراضيًا، يسمح JSP بتتبع الجلسة، وسيتم إنشاء كائن HttpSession جديد تلقائيًا للعملاء الجدد. يتطلب تعطيل تتبع الجلسة إيقاف تشغيله بشكل صريح، ويتم ذلك عن طريق تعيين قيمة سمة الجلسة في توجيه الصفحة إلى false، كما يلي:
<%@ جلسة الصفحة = "false" %>
يعرض محرك JSP كائن الجلسة الأساسي للمطورين. نظرًا لتوفير كائن الجلسة، يمكن للمطورين تخزين البيانات أو استرجاعها بسهولة.
يسرد الجدول التالي بعض الطرق المهمة لكائن الجلسة:
SN | الطريقة والوصف |
---|---|
1 | يقوم الكائن العام getAttribute(اسم السلسلة) بإرجاع الكائن المرتبط بالاسم المحدد في كائن الجلسة، أو يكون فارغًا إذا لم يكن موجودًا. |
2 | يقوم التعداد العام getAttributeNames() بإرجاع كافة أسماء الكائنات في كائن الجلسة |
3 | يُرجع getCreationTime() العام الطويل الوقت الذي تم فيه إنشاء كائن الجلسة، بالمللي ثانية، بدءًا من الصباح الباكر في 1 يناير 1970 |
4 | تقوم السلسلة العامة getId() بإرجاع معرف كائن الجلسة |
5 | تقوم getLastAccessedTime() العامة بإرجاع آخر وقت وصول للعميل، بالمللي ثانية، بدءًا من الصباح الباكر في 1 يناير 1970 |
6 | يقوم public int getMaxInactiveInterval() بإرجاع الحد الأقصى للفاصل الزمني، بالثواني، والذي ستبقي حاوية servlet الجلسة مفتوحة خلاله |
7 | يبطل الفراغ العام () الجلسة ويفك ربط أي كائنات مرتبطة بالجلسة. |
8 | public boolean isNew( يُرجع ما إذا كان عميلاً جديدًا، أو ما إذا كان العميل يرفض الانضمام إلى الجلسة |
9 | إزالة الفراغ العام (اسم السلسلة) يزيل الكائن بالاسم المحدد في الجلسة |
10 | يستخدم public void setAttribute(String name, Object value) الاسم والقيمة المحددين لإنشاء كائن وربطه بالجلسة |
11 | يتم استخدام setMaxInactiveInterval (الفاصل الزمني) باطلة عامة لتحديد الوقت، بالثواني، الذي ستحافظ خلاله حاوية servlet على الجلسة صالحة. |
يصف هذا المثال كيفية استخدام كائن HttpSession للحصول على وقت الإنشاء ووقت الوصول الأخير. سنقوم بربط كائن جلسة جديد بكائن الطلب إذا لم يكن موجودًا بالفعل.
<%@ page import="java.io.*,java.util.*" %><% // احصل على وقت إنشاء الجلسة Date createTime = new Date(session.getCreationTime()); آخر صفحة تمت زيارتها Date lastAccessTime = new Date(session.getLastAccessedTime()); String title = "مرحبًا بعودتك إلى موقع الويب الخاص بي"; new String("visitCount"); String userIDKey = new String("userID"); String userID = new String("ABCD"); ){ title = "مرحبًا بك في موقع الويب الخاص بي"; session.setAttribute(userIDKey, userID); (Integer)session.getAttribute(visitCountKey); VisitCount = VisitCount + 1; userID = (String)session.getAttribute(userIDKey); </title></head><body><center><h1>تتبع الجلسة</h1></center><table align="center"> <tr bgcolor="#949494"> <th>معلومات الجلسة</th> <th>القيمة</th></tr> <tr> <td>id</td> <td><% out.print( session. getId()); %></td></tr> <tr> <td>وقت الإنشاء</td> <td><% out.print(createTime %></td></tr> < آر> <td>وقت آخر وصول</td> <td><% out.print(lastAccessTime %></td></tr> <tr> <td>معرف المستخدم</td> <td><%); out.print(userID); %></td></tr> <tr> <td>عدد الزيارات</td> <td><% out.print(visitCount %></td></); آر> </الجدول> </body></html>
حاول الوصول إلى http://localhost:8080/main.jsp وسيتم الحصول على النتائج التالية عند التشغيل لأول مرة:
قم بالزيارة مرة أخرى وستحصل على النتائج التالية:
بعد معالجة بيانات جلسة المستخدم، لديك الخيارات التالية:
إزالة سمة معينة:
استدعاء الأسلوب public void RemoveAttribute(String name) لإزالة السمة المحددة.
حذف الجلسة بأكملها:
قم باستدعاء طريقة الفراغ العام () لإبطال الجلسة بأكملها.
تحديد فترة صلاحية الجلسة:
قم باستدعاء أسلوب setMaxInactiveInterval (الفاصل الزمني) العام الفارغ لتعيين مهلة الجلسة.
مستخدم تسجيل الخروج:
يمكن للخوادم التي تدعم الإصدار 2.4 من servlet استدعاء طريقة تسجيل الخروج () لتسجيل خروج المستخدم وإبطال جميع الجلسات ذات الصلة.
تكوين ملف web.xml:
إذا كنت تستخدم Tomcat، فيمكنك تكوين ملف web.xml كما يلي:
<session-config> <session-timeout>15</session-timeout> </session-config>
المهلة بالدقائق، والمهلة الافتراضية في Tomcat هي 30 دقيقة.
تقوم طريقة getMaxInactiveInterval () في Servlet بإرجاع المهلة بالثواني. إذا تم تكوين 15 دقيقة في web.xml، فسوف تقوم طريقة getMaxInactiveInterval() بإرجاع 900.