كنجم صاعد، يمكن لـ JSP أن يحتل موقعًا معينًا في بيئة برمجة الخادم، وهو ما يرتبط ارتباطًا وثيقًا بدعمه الجيد لسلسلة من معايير الصناعة. الجلسة هي إحدى البنية التحتية التي توفرها. كمبرمج، يمكنك بسهولة تنفيذ إدارة مستخدم بسيطة تعتمد على الجلسة دون القلق بشأن كيفية تنفيذها على العميل. هناك عدة طرق مختلفة للتعامل مع مستخدمي الإنترنت هذه الأيام.
أحدهما هو أن المستخدم يتحكم في تحديث الصفحة، ويتحكم الخادم في مهلة مثل 30 دقيقة، وبعد انتهاء الوقت، سيتم طرد المستخدم إذا لم يكن هناك أي إجراء. وتتمثل ميزة هذه الطريقة في أنه إذا نسي المستخدم تسجيل الخروج، فيمكنه منع الآخرين من العمليات الضارة. العيب هو أنه إذا كنت تفعل شيئًا يستغرق الكثير من الوقت ويتجاوز هذا الحد الزمني، فقد تضطر إلى تسجيل الدخول مرة أخرى عند الإرسال. إذا اضطر سطح الورقة الأصلي إلى الفشل مرة أخرى، فقد تفقد العمل الذي قمت به. من منظور التنفيذ، هذا هو الأبسط، ويقوم جانب الخادم بتنفيذ هذا الوضع افتراضيًا.
هناك طريقة أخرى وهي أن الموقع يعتمد بنية إطار، ويوجد إطار أو إطار iframe مخفي يتم تحديثه باستمرار، لذلك لن يتم طردك أبدًا. ومع ذلك، من أجل تحديد ما إذا كنت متصلاً بالإنترنت، يحتاج الخادم إلى تعيين إذا تجاوزت وقت الذهول هذا، إذا لم تقم بتحديث الصفحات الأخرى باستثناء هذه الصفحة التي تم تحديثها تلقائيًا، فسيتم اعتبار أنك لم تعد متصلاً بالإنترنت. والمثال النموذجي لهذا النهج هو xici.net. وتتمثل ميزته في أنه يمكنه استخدام التحديث المستمر لتنفيذ بعض الوظائف المشابهة للدفع بالخادم، مثل إرسال الرسائل بين مستخدمي الإنترنت.
بغض النظر عن الوضع المستخدم، يجب القيام ببعض الأعمال الإضافية لتصفح جميع المستخدمين المتصلين حاليًا. لا توجد واجهة برمجة تطبيقات للحصول على قائمة الجلسات في واجهة برمجة تطبيقات Servlet.
ما يمكن استخدامه هو المستمع. تختلف مواصفات Servlet 2.2 و 2.3 قليلاً هنا. يمكن لـ HttpSessionBindingListener في الإصدار 2.2 تنفيذ فئة تُعلمك عند تغيير السمة في جلسة HTTPSession. تم تقديم HttpSessionAttributeListener أيضًا في الإصدار 2.3. نظرًا لأن البيئة التي أستخدمها هي Visual age لـ Java 4 وJRun server 3.1، فإنها لا تدعم برمجة Servlet 2.3 بشكل مباشر. وهنا أستخدم
HttpSessionBindingListener تنفيذ واجهة HttpSessionBindingListener. تحتوي هذه الواجهة على طريقتين:
قيمة باطلة عامة (حدث HttpSessionBindingEvent)
قيمة باطلة عامة Unbound (حدث HttpSessionBindingEvent)
عند تنفيذ Session.addAttribute(String,Object)، إذا قمت بإضافة فئة تنفذ واجهة HttpSessionBindingListener كسمة، فسوف تخطر الجلسة فصلك واستدعاء طريقة valueBound الخاصة بك. على العكس من ذلك، يتوافق الأسلوب Session.removeAttribute مع الأسلوب valueUndound.
الطبقة العامة HttpSessionBinding تنفذ javax.servlet.http.HttpSessionBindingListener { تطبيق ServletContext = null; HttpSessionBinding العام (تطبيق ServletContext) { ممتاز()؛ إذا (التطبيق == فارغ) throw new IllegalArgumentException("التطبيق الفارغ غير مقبول."); this.application = application; } قيمة باطلة عامة (javax.servlet.http.HttpSessionBindingEvent e) { Vector activeSessions = (Vector) application.getAttribute("activeSessions"); إذا (activeSessions == فارغة) { activeSessions = new Vector(); } JDBCUser sessionUser = (JDBCUser)e.getSession().getAttribute("user"); إذا (sessionUser ! = فارغة) { activeSessions.add(e.getSession()); } application.setAttribute("activeSessions",activeSessions); } قيمة الفراغ العام Unbound (javax.servlet.http.HttpSessionBindingEvent e) { JDBCUser sessionUser = (JDBCUser)e.getSession().getAttribute("user"); إذا (جلسة المستخدم == خالية) { Vector activeSessions = (Vector) application.getAttribute("activeSessions"); إذا (activeSessions != null) { activeSessions.remove(e.getSession().getId()); application.setAttribute("activeSessions",activeSessions); } } } } |
افترض أن فئة JDBCUser هي فئة مستخدم عشوائية. عند إجراء تسجيل دخول المستخدم، أضف كلاً من فئة المستخدم وفئة HttpSessionBinding إلى الجلسة.
بهذه الطريقة، في كل مرة يقوم فيها المستخدم بتسجيل الدخول، سيتم إضافة سجل إلى ناقل السمة "activeSessions" في التطبيق. عندما تنتهي مهلة الجلسة، يتم تشغيل valueUnbound، ويتم حذف الجلسة التي على وشك الانتهاء من هذا المتجه.
تسجيل الدخول الفارغ العام () يلقي ACLException، SQLException، IOException { /* الحصول على فئة مستخدم JDBC */ إذا (المستخدم! = فارغ) { تسجيل الخروج(); } { // إذا انتهت مهلة الجلسة، أو لم يسجل المستخدم تسجيل الدخول، فاحفظ عنوان URL المستهدف مؤقتًا. JDBCUserFactory uf = new JDBCUserFactory(); إذا ( (this.request.getParameter("userID")==null) || (this.request.getParameter("password")==null)) ) { throw new ACLException("الرجاء إدخال اسم مستخدم وكلمة مرور صالحين."); } مستخدم JDBCUser = (JDBCUser) uf.UserLogin( this.request.getParameter("userID"), this.request.getParameter("كلمة المرور")); user.touchLoginTime(); this.session.setAttribute("user",user); this.session.setAttribute("BindingNotify",new HttpSessionBinding(application)); } } |
عند تسجيل الدخول، قم بإضافة المستخدم وفئة الغرض BindingNotofy إلى الجلسة. عند تسجيل الخروج، يجب عليك حذف الجلسة بشكل نشط في ناقل activeSessions. |
|
توجد هاتان الوظيفتان في فئة HttpSessionManager. تشير هذه الفئة إلى كائن التطبيق العام في jsp. الكود الآخر لهذه الفئة ليس له علاقة بهذه المقالة وهو طويل جدًا، لذا لن أقوم بنشره. دعونا نلقي نظرة على كيفية استخدامه في JSP. افترض أنه تم إرسال نموذج تسجيل الدخول إلى doLogin.jsp، ويحتوي النموذج على حقلي اسم المستخدم وكلمة المرور. مقتطفات مقتبسة: |
|
دعونا نرى كيف نحصل على قائمة بالمستخدمين المتصلين حاليًا. |
|
يسترد الكود أعلاه activeSessions من التطبيق ويعرض الوقت المحدد. من المفترض أن تكون فئة BeaconDate فئة زمنية منسقة. بهذه الطريقة، نحصل على إطار عمل لعرض قائمة المستخدمين عبر الإنترنت. أما بالنسبة لترحيل قائمة المستخدمين عبر الإنترنت والوظائف الأخرى، فهي لا علاقة لها بهذه المقالة ولن تتم مناقشتها. هذا مثال على نموذج عدم التحديث الذي يعتمد على آلية مهلة الجلسة. أشار زميلي sonymusic إلى أن هذا قد لا يكون موثوقًا في كثير من الأحيان بسبب الأفكار المختلفة لكل مصنع. وبالنظر إلى هذا المطلب، من الضروري تحديد ما إذا كان الوقت منذ آخر استخدام من قبل المستخدم الحالي يتجاوز قيمة الوقت المحددة مسبقًا عند تحديث كل سطح ورقة. هذا هو في الأساس تنفيذ مهلة الجلسة بنفسك. إذا كنت بحاجة إلى تنفيذ نموذج التحديث، فيجب عليك استخدام هذه الطريقة للحكم على التحديث لكل سطح ورقة. |