في هذه المقالة ، يستخدم المشروع في Springboot مستمع HTTPSENESSINGERING (أحد المستمعين) لحساب عدد الأشخاص عبر الإنترنت ، وهو في الأساس لحساب عدد الجلسات.
الفكرة بسيطة للغاية ، ولكن هناك تفاصيل لم أتعامل معها ، لذلك قمت بتصحيحها لأكثر من يوم قبل أن أنجز الخطأ.
أولا اكتب مستمع httpsessionlistener. العد هو عدد الجلسات (عدد الأشخاص). عند إنشاء الجلسة ، سيتم تشغيل طريقة SessionCreated للمستمع. عندما يتم تدمير الجلسة ، سيتم تشغيل طريقة SessionDestroyed للمستمع. بعد حساب عدد الأشخاص في المستمع ، ضعه في ServletContext (يمكن فهمه على أنه مستودع حيث يمكن لأي طلب تخزين والحصول على الخصائص في الداخل).
انتبه إلى إضافة webListener إلى المستمع ، لذلك ليست هناك حاجة لتكوينه.
WebListener الفئة العامة onLinEcount تنفذ httpsessionlistener {public int count = 0 ؛ // سجل عدد الجلسات // الاستماع إلى إنشاء الجلسة ، متزامنة مضادة للماجرين ، sessionlized void sessioncreated (httpsessionevent arg0) count ++ ؛ arg0.getSession (). getServletContext (). setAttribute ("count" ، count) ؛ } Override Public Synchronized Void SessionDestroyed (httpsessionevent arg0) {// REFENT SESSION SUSTONGE SYSTEM.OUT.PRINTLN ("【httpsessionlistener butse】 count- redive- redive") ؛ عدد--؛ arg0.getSession (). getServletContext (). setAttribute ("count" ، count) ؛ }}ثم اكتب وحدة تحكم تتجول في عدد الجلسات. لقد بدأت بما يلي ، وهو خطأ!
خذ العد من ServletContext وعد الإرجاع إلى الواجهة الأمامية.
requestmapping ("/count") عدد السلسلة العامة ResponseBonder (httpservletrequest httpservletrequest ، httpservletresponse httpservletresponse) {count count = httpservletrequest.getServletContext (). العودة "العد:"+العد ؛ }هذا خطأ. ستجد أن الصفحة ترى أن Count NULL لأنه لا يتم إنشاء جلسة ، ولا توجد طريقة إحصائية لتشغيل المستمع. لذا قم بتغييره:
controller الفئة العامة indexController {REquestMapping ("/count") عدد السلسلة العامة ResponseBond (httpservletrequest httpservletrequest ، httpservletreSponse httpservletresponse) {httpsentessession = httpservledrequest.getsession () ؛ عدد الكائنات = session.getServletContext (). getAttribute ("count") ؛ العودة "العد:"+العد ؛ }} جلسة httpsession = httpservletrequest.getSession () ؛ الوظيفة: إذا لم يكن لدى المستخدم جلسة ، فسيقوم بإنشاء جلسة ، وإذا كانت هناك جلسة ، فلن يقوم بإنشائها.
يبدو من الصواب تغييره إلى هذا الاختبار ، ولكن هناك مشكلة. المتصفح يتوافق مع جلسة. إذا فتحت متصفحين ، فسترى أن العد هو 2 ، وهو أمر صحيح. ولكن إذا قمت بإغلاق متصفح وفتحته ، فيجب أن يكون 2 ويبقى دون تغيير ، ولكن يصبح 3. والسبب هو أنه لا يتم تنفيذ طريقة تدمير الجلسة. عند إعادة فتحه ، لا يمكن للخادم العثور على الجلسة الأصلية للمستخدم وإعادة إنشاء جلسة. لذلك هناك 3 جلسات ، ولكن لا يوجد سوى متصفحين ، مما يعني أنه يجب أن يكون هناك شخصان فقط عبر الإنترنت في المحاكاة.
هناك طريقتان لحل هذه المشكلة. أحدهما هو استدعاء طريقة لتدمير الجلسة عند إغلاق صفحة الويب. هناك طريقة أخرى أفضل هي السماح للخادم بتذكر الجلسة الأصلية ، أي تسجيل SessionId الأصلي في المتصفح ، وإرسال SessionId في المرة القادمة التي تفتح فيها ، حتى لا يقوم الخادم بإعادة إنشائها.
تم تعديل الرمز على النحو التالي:
controller الفئة العامة indexController {REquestMapping ("/count") رقم سلسلة public ResponseBonder (httpservletrequest httpservletrequest ، httpservletponse htteprevletresponse) {try {// record sessionid in the browser cookie c = new cookie c = urlencoder.encode (httpservletrequest.getSession (). getId () ، "utf-8")) ؛ C.SetPath ("/") ؛ // قم بتعيين فترة صلاحية ملف تعريف الارتباط أولاً إلى يومين ، لا تقلق ، ولن يتم حفظ الجلسة لمدة يومين C.SetMaxage (48 * 60 * 60) ؛ httpservletresponse.addcookie (c) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } جلسة httpsession = httpservletrequest.getSession () ؛ عدد الكائنات = session.getServletContext (). getAttribute ("count") ؛ العودة "العد:"+العد ؛ }}لخص
ما ورد أعلاه هو تحليل حالة من سبرينغ بوت باستخدام شاشات لحساب المستخدمين عبر الإنترنت الذين قدمهم المحرر. آمل أن يكون ذلك مفيدًا للجميع. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر على الجميع في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!