قبل بضعة أيام ، عندما كنت أعمل على نظام تسجيل الوصول ، واجهت مشكلة في الجلسة الشائعة. المشروع هو Spring+SpringMVC+MyBatis Framework ، نظام Javaweb-Side of Maven Management Directory. بالنسبة لبعض قضايا الجلسة ، يتم إجراء التحليل التالي. هنا ، نركز على مسألة دورة حياة الجلسة. أما بالنسبة للتعريفات الأخرى ، فلن نوضح:
أولاً ، دعنا نوضح دورة حياة الجلسة:
التخزين: يتم تخزين الجلسة على جانب الخادم. بشكل عام ، من أجل منعها من تخزينها في ذاكرة الخادم (للوصول عالي السرعة) ، يتم إنشاء Sessinon عندما يصل المستخدم إلى الخادم لأول مرة. من الضروري أن نلاحظ أنه سيتم إنشاء الجلسة فقط عند الوصول إلى JSP و Servlet وغيرها من البرامج. فقط الوصول إلى الموارد الثابتة مثل HTML والصورة لن ينشئ جلسة. في تطبيق javaweb ، يمكنك الاتصال بالطلب . لاحظ أنه عندما تكون المعلمة المنطقية صحيحة ، يتم إجبار جلسة جديدة على إنشاءها هنا.
1. وقت انتهاء الصلاحية:
تنتهي الجلسة بعد آخر مرة تم فيها استخدام الجلسة إلى وقت الفشل المحدد.
2. يتم تنفيذ جلسة طريقة أخرى.
لوقت الإبطال ، يمكنك تحديده عن طريق تكوين الخصائص في web.xml:
<Session-Config> <tess-timeout> وقت انتهاء الصلاحية </session timeout> </session-config>
وحدة وقت الفشل هي دقائق. إذا كانت الجلسة صالحة ليوم واحد ، فيمكن ضبطها على 60*24. عند ضبطها على 0 أو سلبية ، تكون الجلسة صالحة بشكل دائم. وفقًا لتعريف وقت الفشل ، من السهل فهم هذا الموقف.
لماذا تفشل الجلسة بعد إغلاق المتصفح؟
بناءً على ما هو معروف ، تم كتابة مثال بسيط:
ControllerPublic Class SessionTest {REquestMapping ("/SessionTest") SessionTest SessionTest (HttPservletRequest طلب ، httpservletponse) {system.out.println ("Success!") ؛ جلسة httpsession = request.getSession () ؛ session.setMaxInaCtiveInterval (259200) ؛ request.setAttribute ("createTime" ، session.getCreationTime ()) ؛ // creation request.setAttribute ("id" ، session.getID ()) ؛ request.setattribute ("last time" ، session.getlastaccatedtime ()) ؛ // آخر طلب وقت الاستخدام. إرجاع "الصفحة/العروض" ؛ } <table cellpacing = "0" cellpadding = "0"> <tr> <td> وقت الإنشاء: </td> <td> $ {createTime} </td> </td> <td> معرف: </td> <td> $ {id} الوقت: </td> <td> $ {max} </td> </tr> <tr> <td> آخر مرة تستخدم: </td> <td> $ {lasttime} </td> </tr> <tr> <td> الجلسة: </td> <td> $ {SessionTest} </td>تحليل:
يمكن ملاحظة أن وقت إبطال الجلسة هو في الواقع عند إغلاق المتصفح ، لذلك فقط إذا لم يغلق المتصفح والوصول مرة أخرى ، يمكنك الاستمرار في استخدام حالة تسجيل الدخول. ما الذي يمثله وقت الإبطال الذي حددناه أعلاه؟
تم إنشاء جلسة بين المتصفح والخادم. نظرًا لأن العميل لم يتفاعل مع الخادم لفترة طويلة (وقت السبات) ، فقد دمر الخادم هذه الجلسة. الجلسة السابقة عندما تفاعل العميل مع الخادم مرة أخرى لم تكن موجودة. أفهم أن وقت الإبطال يسري فقط أثناء الجلسة. إذا تم إغلاق المتصفح وينتهي الجلسة ، يتم تعيين وقت الإبطال على صالح دائم ، وهي اللحظة التي يتم فيها إغلاق المتصفح وإغلاق الجلسة. لحل هذه المشكلة ، يمكنك مزج ملفات تعريف الارتباط مع الجلسات. هناك طريقة غبية:
إضافة ملفات تعريف الارتباط بنشاط لتعيين دليل حفظ ووقت البقاء على قيد الحياة
addcookie addcookie الثابتة العامة (اسم السلسلة ، قيمة السلسلة ، int age ، httpservletresponse) يرمي UnsupportedEncodingException {cookie c = new cookie (name ، urlencoder.encode (value ، "utf-8")) ؛ C.SetMaxage (العمر) ؛ C.SetPath (المسار) ؛ استجابة. addcookie (c) ؛ } عند الوصول مرة أخرى ، استخدم Cookie[] cookies = request.getCookies(); لاجتياز ملفات تعريف الارتباط ، الحصول على ملف تعريف الارتباط المطلوب وفقًا لاسم ملف تعريف الارتباط ، أو يمكن قول أنه جلسة. أخيرًا ، تحصل على النتيجة المرجوة ، وتهرب الجلسة (ملف تعريف الارتباط المسمى JSessionId) من سجن المتصفح.
لخص
ما سبق هو الحل لمشكلة فشل جلسة J2EE بعد إغلاق المتصفح. آمل أن يكون ذلك مفيدًا للجميع. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر على الجميع في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!