English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

جلسة JSP

HTTP هو بروتوكول غير معتمد، مما يعني أنه كل مرة يبحث العميل عن صفحة، يجب فتح اتصال خادم جديد، لذا لن يُسجل الخادم أي معلومات حول طلبات العميل السابقة.

هناك ثلاث طرق للحفاظ على الجلسة بين العميل والخادم:

    الكوكي

يمكن للخادم الشبكي تحديد ID جلسة فريد ككوكي يمثل كل عميل، لتحديد الطلبات التالية للعميل.

قد لا يكون هذا الأسلوب فعالًا دائمًا، لأنه في كثير من الأحيان لا يدعم المتصفح الكوكي، لذا ننصح بعدم استخدام هذا الأسلوب للحفاظ على الجلسة.

    مجال النموذج المخفي

يمكن للخادم الشبكي إرسال مجال نموذج HTML مخفي وإيداع ID جلسة فريد، مثل ما يلي:

<input type="hidden" name="sessionid" value="12345">

يعني هذا، عند تقديم النموذج، سيتم تلقائيًا تضمين الاسم والمقدار المحدد في بيانات GET أو POST. يمكن استخدام قيمة session_id في كل مرة يرسل المتصفح طلبًا لتحديد مسار المتصفح المختلف.

قد يكون هذا الطريقة فعالة، ولكن عند النقر على رابط <A HREF> لا يحدث بيانات إرسال النموذج، لذا لا يدعم تعديل النموذج التتبع الجماعي للجلسات.

    تعديل URL

يمكنك إضافة بيانات إضافية بعد كل URL لتفرقة الجلسات، يمكن للخادم ربط معرف الجلسة بناءً على هذه البيانات.

على سبيل المثال، http://oldtoolbag.com/file.htm;sessionid=12345، معرف الجلسة هو sessionid=12345، يمكن للخادم استخدام هذه البيانات لتحديد العميل.

من الناحية الأخرى، يعتبر تعديل URL طريقة أفضل، حتى لو لم يدعم المتصفح ملفات cookies، ولكن العيب هو أنه يجب تخصيص session ID ديناميكيًا لكل URL، حتى لو كان مجرد صفحة HTML بسيطة.

    sessionobject

بالإضافة إلى الطرق المذكورة أعلاه، يستخدم JSP واجهة HttpSession التي يقدمها servlet لتحديد المستخدم، و حفظ جميع معلومات زيارات المستخدم.

بافتراض الافتراض، يسمح JSP بتتبع الجلسة، ويتم إنشاء HttpSessionobject جديد تلقائيًا للعميل الجديد. يجب إيقاف تتبع الجلسة بشكل صريح، من خلال تعيين قيمة خاصية session في تعليمات page إلى false، مثل ما هو موضح أدناه:

<%@ page session="false" %>

يقدم محرك JSP sessionobject الخفي إلى المطورين. بفضل وجود sessionobject، يمكن للمطورين بسهولة حفظ أو استرجاع البيانات.

في الجدول أدناه، تمت عرض بعض الطرق المهمة لـ sessionobject:

S.N.الطريقة & وصف
                1public Object getAttribute(String name) يعود العنصر الم绑定 بناءً على الاسم المحدد في sessionobject، إذا لم يكن موجودًا فيرجع null
                2public Enumeration getAttributeNames() يعود أسماء جميع العناصر في sessionobject
                3public long getCreationTime() يعود الوقت الذي تم إنشاء session对象، بالألفية، من منتصف الليل من 1 يناير 1970
                4public String getId() إرجاع ID كائن الجلسة
                5public long getLastAccessedTime() إرجاع وقتآخرالزيارة للعميل بالألف ثانية، من بداية 1 يناير 1970
                6public int getMaxInactiveInterval() إرجاع الوقت الأقصى بالثواني، سينقوم servlet المحلل بحفظ الجلسة مفتوحة خلال هذا الوقت
                7public void invalidate() إبطال الجلسة، وتفكيك أي كائنات مرتبطة بالجلسة
                8public boolean isNew() إرجاع ما إذا كان العميل جديدًا أو رفض العميل الانضمام إلى session
                9public void removeAttribute(String name) إزالة كائن معين من session
                10public void setAttribute(String name, Object value)  استخدام الاسم والمقدار المحدد لإنشاء كائن وتقيده في session
                11public void setMaxInactiveInterval(int interval) لتحديد الوقت بالثواني، سينقوم servlet المحلل بحفظ الجلسة نشطة خلال هذا الوقت

تطبيق جلسة JSP

هذا المثال يصف كيفية استخدام كائن HttpSession للحصول على وقتإنشاء ووقتآخرالزيارة. سنقوم بربط كائن جديد من session مع request إذا لم يكن موجودًا.

<%@ الصفحة لغة="java" نوعالنص="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%
<%@ الصفحة إدخال="java.io.*,java.util.*" %>
<%
   // الحصول على وقتإنشاء session
   التاريخ Date وقتإنشاء = جديد التاريخ(session.getCreationTime());
   // الحصول على وقتآخرالزيارة الصفحة
   التاريخ Date وقتآخرالزيارة = جديد التاريخ(session.getLASTAccessedTime());
   النص String عنوان = "زيارة مرة أخرى موقع تعليمية الأساس";
   عدد صحيح زائرCount = جديد عدد صحيح(0);
   String visitCountKey = new String("visitCount");
   String userIDKey = new String("userID");
   String userID = new String("ABCD");
   // تحقق من وجود زيارات جديدة للموقع
   if (session.isNew()){
      title = "مثال شبكة تعليم أساسي للزيارات";
      session.setAttribute(userIDKey, userID);
      session.setAttribute(visitCountKey,  visitCount);
   } else {
       visitCount = (Integer)session.getAttribute(visitCountKey);
       visitCount += 1;
       userID = (String)session.getAttribute(userIDKey);
       session.setAttribute(visitCountKey,  visitCount);
   }
%>
<html>
<head>
<title>متابعة الجلسة</title>
</head>
<body>
<h1>متابعة الجلسة</h1>
<table border="1" align="center"> 
<tr bgcolor="#949494">
   <th>معلومات الجلسة</th>
   <th>قيمة</th>
</tr> 
<tr>
   <td>معرف</td>
   <td><% out.print( session.getId()); %></td>
</tr> 
<tr>
   <td>تاريخ إنشاء</td>
   <td><% out.print(createTime); %></td>
</tr> 
<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>
</tr> 
</table> 
</body>
</html>

حاول زيارة http://localhost:8080/testjsp/main.jsp ،سيكون النتيجة التالية عند تشغيله لأول مرة:

عند زيارة مرة أخرى، سيتم الحصول على النتيجة التالية:

حذف بيانات الجلسة

بعد معالجة بيانات جلسة المستخدم، يمكنك اتخاذ من بين الخيارات التالية:

  • إزالة خاصية معينة:

    استدعاء طريقة public void removeAttribute(String name) لإزالة الخاصية المحددة.

  • حذف الجلسة بأكملها:

    استدعاء طريقة public void invalidate() لجعل الجلسة بأكملها غير صالحة.

  • ضبط فترة الجلسة:

    استدعاء طريقة public void setMaxInactiveInterval(int interval) لضبط وقت انتهاء الجلسة.

  • تسجيل الخروج المستخدم:

    يمكن للخوادم التي تدعم إصدار servlet 2.4 استدعاء طريقة logout() لتسجيل الخروج المستخدم، وجعل جميع الجلسات ذات الصلة غير صالحة.

  • إعداد ملف web.xml:

    إذا كنت تستخدم Tomcat، يمكنك إعداد ملف web.xml كما يلي:

  <session-config>
    <session-timeout>15</session-timeout>
  </session-config>

يتم حساب الوقت الزائد بالدقائق، والوقت الزائد الافتراضي في Tomcat هو 30 دقيقة.

يستعيد方法是 getMaxInactiveInterval( ) في Servlet بالثواني. إذا كان الإعداد في web.xml هو 15 دقيقة، فإن getMaxInactiveInterval( ) سيستعيد 900.