تقديم النماذج المتكررة: غير مكتمل مرة واحدة ، أولاً ، اطلب صفحة النموذج -> ثم أرسل عملية النموذج لإكمال إرسال البيانات
السبب الجذري: عدم القيام بذلك بالكامل ، واطلب أولاً صفحة النموذج -> ثم أرسل عملية النموذج.
يسبب التقديمات المتكررة:
ملاحظة: بعد التراجع ، قم بتحديث صفحة النموذج وإرسالها مرة أخرى. في هذا الوقت ، بدلاً من تكرار التقديم ، يتم إرسال طلب جديد. تحت Firefox ، فإن تشغيل تكرار التقديم إلى العنوان نفسه غير صالح.
قضية:
WebServlet ("/trans") transferservlet الفئة العامة يمتد httpservlet {private static final long serialversionuid = 1L ؛ خدمة void المحمية (httpservletrequest req ، httpservletresponse resp) يلقي servletexception ، ioException {req.setcharacterencoding ("utf-8") ؛ Resp.SetContentType ("Text/Html ؛ charset = utf-8") ؛ printWriter out = resp.getWriter () ؛ سلسلة الأموال = req.getParameter ("المال") ؛ // محاكاة تأخير الشبكة جرب {thread.sleep (3000) ؛ } catch (interruptedException e) {E.PrintStackTrace () ؛ } system.out.println ("تم نقل المبلغ:"+المال) ؛ Out.print ("تم نقل المبلغ:"+المال) ؛ }}تحت النقطة المجنونة ، ستجد أن صفحة JSP لن تتغير ، ولكن يمكنك أن ترى من خلال المطبوعة في الخلفية ، وسيتم الإخراج بشكل مستمر ، مما يشير إلى أنه يتم تنفيذه طوال الوقت
حل:
قبل تقديم الضمان ، يجب أولاً طلب واجهة النموذج. المبدأ هو نفس رمز التحقق .--- آلية الرمز المميز
عند طلب المرة الأولى ، عند طلب واجهة النموذج ، قم بإنشاء رمز رمزي. عند النقر فوق نقل وإرسال الطلب ، أحضر هذا الرمز المميز وأرسله إلى الواجهة التالية. تحقق من الرمز المميز في servlet. هذا الرمز هو واحد في الجلسة وواحد في النموذج. التعادل يعني أن النموذج صحيح ، ويتم تدمير الرمز المميز في هذه الجلسة.
رمز في صفحة JSP
<٪ // إنشاء Token String Token = java.Util.uuid.RandomUuid (). toString () ؛ // إحدى الجلسة موجودة ، ثم قم بإعداد جلسة حكم. ٪> <h3> واجهة نقل </h3> <form action = "/trans" method = "post"> <input type = "hidden" name = "token" value = "<٪ = token ٪>"/> مبلغ التحويل: <إدخال type = "text" name = "money" min = "1" مطلوب/> <br/>
رمز في transferservlet
WebServlet ("/trans") transferservlet الفئة العامة يمتد httpservlet {private static final long serialversionuid = 1L ؛ خدمة void المحمية (httpservletrequest req ، httpservletresponse resp) يلقي servletexception ، ioException {req.setcharacterencoding ("utf-8") ؛ Resp.SetContentType ("Text/Html ؛ charset = utf-8") ؛ printWriter out = resp.getWriter () ؛ // احصل على قيمة الرمز المميز في رمز سلسلة النموذج = req.getParameter ("Token") ؛ // احصل على قيمة الرمز المميز في Session String SessionToken = (String) req.getSession (). getAttribute ("token_in_session") ؛ // من السهل أن تكون الرمز المميز في الجلسة فارغًا لأن الرمز المميز في الجلسة يمكن تدميره إذا (token.equals (sessiontoken)) {// تشير إلى أن الرمز المميز هو نفس req.getSession (). removeAttribute ("token_in_session") ؛ سلسلة الأموال = req.getParameter ("المال") ؛ System.out.println ("مبلغ التحويل:"+المال) ؛ Out.print ("مبلغ التحويل:"+المال) ؛ // أخيرًا تدمير الرمز المميز في الجلسة} // إذا كان الرمز مختلفًا ، فهذا يعني أنه عرض متكرر ولا يمكن إرساله}}ثم ، حتى لا تظهر في رمز Java في ملف JSP ، قم بإنشاء الرمز المميز والقفز فيه في Servlet
webservlet ("/transfer") الفئة العامة copyoftransferservlet يمتد httpservlet {private static final long serialversionuid = 1l ؛ خدمة void المحمية (httpservletrequest req ، httpservletresponse resp) يلقي servletexception ، ioException {// إنشاء الرمز المميز وقفز إلى إرسال. System.out.println (رمز) ؛ req.getSession (). req.setAttribute ("Token" ، token) ؛ req.getRequestDispatcher ("/views/repertsubmit/submit.jsp"). }}هذا ما يبدو عليه ملف JSP الآن
<H3> واجهة نقل </h3> <form action = "/trans" method = "post"> <input type = "hidden" name = "token" value = "$ {token}"/> مبلغ التحويل: <إدخال type = "text" name = "mone"إنه أكثر نظافة من ما سبق وأكثر أناقة ، لكنه لا يزال لا يشعر بالرضا ، لأنه إذا كنت بحاجة إلى استخدامه في أماكن أخرى ، فأنت بحاجة إلى إنشاء الرموز المميزة والتحقق من الرموز المميزة وحذف الرموز ، لذلك يمكنك استخراجها لتكوين فئة الأدوات
tokenutil.java
// Token Tool Class // إنشاء رمز الرمز المميز // تحقق من الرمز المميز // تدمير الرمز المميز للفئة العامة tokenutil {private Final Static String Token_In_Session = "Token_In_Session" ؛ public static void savatoken (httpservletrequest req) {string token = uuid.randomuuid (). toString () ؛ System.out.println (رمز) ؛ req.getSession (). setAttribute (token_in_session ، token) ؛ req.setAttribute ("Token" ، token) ؛ ) if (tokeninRequest.equals (sessionToken)) {req.getSession (). العودة صحيح. } إرجاع خطأ ؛ }}هذا جيد. يحتاج المستخدم فقط إلى استدعاء فئة الأدوات هذه ، وليس هناك حاجة لكتابة سلسلة من العمليات مثل إنشاء رمز رمزي.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.