في الآونة الأخيرة ، كنت أكتب موقع شراء للكتاب. عند اختبار وظيفة تسجيل الدخول ، النقر فوق المتصفح للعودة إلى تحديث المتصفح ، ستجد أن المستخدم الذي قام بتسجيل الدخول بالفعل قد قام بتسجيل الدخول مرة أخرى.
بعد التفكير لفترة طويلة ، وجدت العديد من الحلول عبر الإنترنت ، ولكن معظم الطرق المقدمة عبر الإنترنت هي استخدام JS لتسجيل الخروج وحظر المستخدمين من النقر على المتصفح للعودة.
على الرغم من أن هذه الطريقة ممكنة ، إلا أنها لا تحل هذه المشكلة في الخلفية. يبدو الأمر وكأنه حراسة ضد السادة ولكن ليس الأشرار.
فيما يلي الطريقة التي قمت بتنفيذها
مبدأ:
بعد تسجيل الخروج ، انقر فوق المتصفح للعودة لتحديث المتصفح. في الواقع ، يعيش المتصفح معلومات النموذج الأصلي.
تسجيل الخروج يعني قتل الجلسة الأصلية
// تسجيل الخروج من Void LogOut (طلب httpservletrequest ، استجابة httpservletresponse) يلقي servletexception ، ioException {httpsession session = request.getSession () ؛ request.setAttribute ("SessionId" ، session.getId ()) ؛ Session.RemoVeatTribute ("user") ؛ session.invalidate () ؛ استجابة. } عند إعادة توجيه صفحة JSP بعد تسجيل الخروج ، تختلف الجلسة التي تم إنشاؤها عن الجلسة الأصلية (يتم تمكين جلسة صفحة JSP افتراضيًا)
وهذا يعني ، بعد تسجيل الخروج ، النقر على المتصفح للعودة إلى تحديث الجلسة هو جلسة جديدة. من هذا المنظور ، فكر في الحل.
أضع جزءًا من البيانات في الجلسة الأصلية. يمكنني الحصول على هذه البيانات لأول مرة عندما قمت بتسجيل الدخول. بعد تسجيل الخروج ، انتهت الجلسة الأصلية. انقر على المتصفح للعودة إلى التحديث. لا توجد بيانات في الجلسة الجديدة. القيمة التي تم الحصول عليها خالية
تطابق البيانات في الجلسة الأصلية مع قيمة الجلسة الجديدة. واحد لديه قيمة والآخر لاغية. سوف المطابقة تفشل بالتأكيد. في هذا الوقت ، يمكنك تقديم موجه سهل الاستخدام والسماح للمستخدم بتسجيل الدخول مرة أخرى.
فكيف يمكن حفظ البيانات في الجلسة الأصلية بعد تسجيل الخروج (إذا تم إلغاء الجلسة الأصلية ، فستختفي)؟ فكر في إضافة مجال مخفي إلى النموذج ووضع البيانات في الجلسة الأصلية في المجال المخفي. بعد تسجيل الخروج ، انقر فوق المتصفح للعودة إلى التحديث. سيقوم المتصفح تلقائيًا بإرسال البيانات في الجلسة الأصلية دون حفظها يدويًا بنفسك (في الواقع ، قد يتعين وضع الادخار اليدوي في سياق تطبيق ServletContext ، ولم أجربه أبدًا)
يشبه إلى حد ما حل التقديم المتكرر للنماذج ، ولكن لا يمكن القضاء على البيانات في الجلسة الأصلية هنا ، لأن الجلسة نفسها ليست هي نفس الجلسة قبل وبعد تسجيل الدخول.
التفاصيل كما يلي: في login.jsp
<٪ string token = new random (). nextlong ()+"" ؛ session.setAttribute ("token" ، token) ؛ ٪> <form action = "$ {pagecontext.request.contextpath}/servlet/clientslet؟ operation = login" method = "post"> <td> name = "name"> </td> </tr> <tr> <td align = "right"> كلمة المرور: </td> <td> <type type = "password" name = "password"> </td> </td> <tr> <td> </td> <td> <td> <two type = "إرسال" value = "login"> value = "$ {sessionscope.token}"> </part> في Servlet ، أعط موجهًا وديًا وإعادة توجيه إلى صفحة تسجيل الدخول
جلسة httpsession = request.getSession () ؛ // حل مشكلة تسجيل الدخول المتكرر للمتصفح بعد تسجيل الخروج // إعطاء حقل إدخال مخفي ، واحصل على قيمة المجال المخفي في الخلفية // تحديث المتصفح بعد تسجيل الخروج سيؤدي إلى إنشاء جلسة جديدة ، بحيث يتم الحصول على جلسة جلسة خاطئة (tokning). سلسلة hiddentoken = request.getParameter ("Token") ؛ if (! hiddentoken.equals (sessionToken)) {request.setAttribute ("message" ، "لقد قمت بتسجيل الخروج ، يرجى تسجيل الدخول مرة أخرى ، والانتقال إلى صفحة تسجيل الدخول بعد 2 ثانية <meta http-equiv = 'refresh' content = 2 ؛ url =" + request.getContextPath () + "/"/". request.getRequestDispatcher ("/client/message.jsp"). يعود؛ } امتحان:
تسجيل الدخول
بعد تسجيل الخروج ، انقر فوق المتصفح للعودة إلى التحديث. سوف يطالب المتصفح بما إذا كان سيتم إعادة تقديم البيانات.
انقر لإعادة الالتزام
هذا يحل مشكلة النقر فوق المتصفح للعودة لتحديث المستخدم وتسجيل الدخول مرة أخرى بعد تسجيل الخروج.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.