English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
في الآونة الأخيرة، كنت أكتب موقعًا لشراء الكتب، عند اختبار وظيفة إلغاء تسجيل الدخول، عندما أضغط على زر العودة في المتصفح لإعادة تحديث الصفحة، وجدت أن المستخدم الذي تم إلغاء تسجيل دخوله قد تسجل دخوله مرة أخرى
فكرت لفترة طويلة وبحثت كثيرًا على الإنترنت، ولكن معظم الحلول التي يقدمها الإنترنت تستخدم JavaScript لمنع المستخدم من النقر على زر العودة في المتصفح بعد إلغاء تسجيل الدخول
بالرغم من أن هذه الطريقة قابلة للتطبيق، إلا أنها لا تحل المشكلة في الواقع في الخلفية، يبدو الأمر وكأنه يحرس الأشخاص الكبار وليس الصغار
سأقوم الآن بتسجيل طريقة تنفيذي
النظرية:
عند إعادة تحديث المتصفح بعد الخروج، في الواقع يقوم المتصفح بإعادة إرسال معلومات form الأصلية مرة أخرى
إلغاء تسجيل الدخول يعني إزالة session الأصلي
// إلغاء تسجيل الدخول private void logout(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); request.setAttribute("sessionId", session.getId()); session.removeAttribute("user"); session.invalidate(); response.sendRedirect(request.getContextPath() + "/index.jsp"); }
عند إعادة توجيه إلى صفحة jsp بعد الخروج، يتم إنشاء session مختلفة عن session الأصلية (بالافتراض، يتم تفعيل session في صفحات jsp).
بمعنى أن session الجديدة التي يتم النقر عليها بعد الخروج وإعادة تحديث المتصفح هي session جديدة، من هذا المنظور يمكن التفكير في الحلول.
أضع بعض البيانات في session الأصلية، يمكن الحصول على هذا البيان عند الدخول لأول مرة، بعد الخروج يختفي session الأصلي، عند النقر على زر العودة في المتصفح، لا يوجد بيانات في session الجديدة، والقيمة التي يتم الحصول عليها هي null.
ستقوم بمطابقة بيانات session الأصلية مع قيمة session الجديدة، واحدة بها قيمة والأخرى بدون قيمة، سيتم الفشل في التوافق بالتأكيد، في هذه الحالة يمكن تقديم رسالة ودية للمستخدم لطلب إعادة تسجيل الدخول.
إذن كيف يمكن حفظ بيانات session الأصلية بعد تسجيل الخروج (بعد تسجيل الخروج يتم فقد session الأصلي)؟ تفكر في إضافة مجال مخفي في الاستمارة، ووضع بيانات session الأصلية في هذا المجال المخفي، وبالتالي بعد تسجيل الخروج وإعادة تحديث المتصفح، سيقوم المتصفح بتحويل بيانات session الأصلية تلقائيًا، دون الحاجة إلى حفظها يدويًا (في الواقع قد يتطلب الأمر وضعها في سياق servletContext التطبيقي، لم يتم اختباره بعد)
يبدو كحل مشابه لحل مشكلة إعادة تقديم استمارة مكررة، ولكن لا يمكن حذف بيانات session الأصلية هنا، لأنها ليست نفس session قبل تسجيل الخروج وبعده
بالتحديد: في login.jsp
<% String token=new Random().nextLong()+""; session.setAttribute("token", token); %> <form action="${pageContext.request.contextPath}/servlet/ClientServlet?operation=login" method="post"> <table style="width: 50%;"> <tr> <td align="right">الاسم:</td> <td><input type="text" name="name"></td> </tr> <tr> <td align="right">كلمة المرور:</td> <td><input type="password" name="password"></td> </tr> <tr> <tr> <td></td> <td><input type="submit" value="تسجيل الدخول"></td> </tr> </table> <input type="hidden" name="token" value="${sessionScope.token}"> </form>
في servlet، قدم توجيهات ودية وإعادة توجيه إلى صفحة تسجيل الدخول
HttpSession session = request.getSession(); //حل مشكلة تسجيل الدخول المتكرر بعد تسجيل الخروج وإعادة تحديث المتصفح //تقديم مجال مخفي، للحصول على قيمة المجال المخفي من الخلفية //بعد تسجيل الخروج وإعادة تحديث المتصفح، يتم إنشاء session جديد، وبالتالي يتم الحصول على sessionToken كـ null //يكون hiddenToken.equals(sessionToken) بالضرورة false String sessionToken = (String) session.getAttribute("token"); String hiddenToken = request.getParameter("token"); if (!hiddenToken.equals(sessionToken)) { request.setAttribute("message", "تم إلغاء التسجيل، يرجى الدخول مرة أخرى بعد 2 ثانية <meta http-equiv='Refresh' content=2;url=" + request.getContextPath() + "/client/login.jsp>"); request.getRequestDispatcher("/client/message.jsp").forward( request, response); return; }
اختبار:
الدخول
بعد إلغاء التسجيل والنقر على رجوع في المتصفح وإعادة تحميل، سيتم إعلام المتصفح بأذا كان يجب إعادة إرسال البيانات
النقر لإعادة إرسال
بهذا تم حل مشكلة النقر على رجوع في المتصفح بعد إلغاء التسجيل وإعادة تحميل المستخدم للدخول.
هذا هو نهاية محتوى هذا المقال، نأمل أن يكون قد ساعدكم في التعلم، ونأمل أيضًا أن تشجعوا دليل التدريب هذا.
بيان: محتوى هذا المقال تم جمعه من الإنترنت، حقوق الطبع والتأليف مملوكة للكاتب الأصلي، المحتوى تم إضافته من قبل مستخدمي الإنترنت بشكل تلقائي، هذا الموقع لا يمتلك حقوق الملكية، لم يتم تعديل المحتوى بشكل يدوي، ولا يتحمل أي مسؤولية قانونية متعلقة بذلك. إذا اكتشفت محتوى يشتبه في انتهاك حقوق الطبع والتأليف، فالرجاء إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (الرجاء استبدال # ب @ عند إرسال البريد الإلكتروني) للإبلاغ، وقدم الدليل على ذلك، إذا تم التحقق من ذلك، سيتم حذف المحتوى المشبوه فورًا.