هل تقوم دائمًا بإعادة التوجيه بعد النشر؟إذا كانت الإجابة بنعم، كيف يمكنك إدارتها؟

StackOverflow https://stackoverflow.com/questions/1083357

  •  23-08-2019
  •  | 
  •  

سؤال

لنفترض أنك تقوم بإرسال نموذج، مما يؤثر على قاعدة بياناتك (إضافة سجلات/حذفها/تحديثها) وهذه هي الطريقة التي يبدو بها طلبك:

POST /application/action=update

لنفترض الآن أنك انتهيت من التحديث، لذا ترغب في نقل المستخدم إلى الصفحة الرئيسية.

Response.sendRedirect /application/action=home

هذا يعمل بشكل رائعيتم إرسال إعادة توجيه للمستخدم بعد POST، لذلك حتى إذا حاول المستخدم تحديث الصفحة بالضغط على F5، فأنت جيد.ومع ذلك، لن ينجح هذا إذا قمت بما يلي:

requestDispatcher.forward(/application/action=home)

نظرًا لوجود سيناريو يتعين عليك فيه عرض أنواع مختلفة من رسائل الخطأ/النجاح بعد الانتهاء من التحديث، فمن المرجح أنك تقوم بعملية إعادة توجيه بعد POST.في مثل هذا السيناريو، كيف يمكنك تجنب حدوث إجراءات التحديث مرتين؟

أجد أنه من الممتع أن العديد من المواقع الآمنة (البنوك)/بوابات الدفع تميل إلى إعلام المستخدم عن طريق وضع نص على الشاشة، مثل "الرجاء عدم الضغط على أزرار الرجوع/التحديث".

ألا توجد طريقة أفضل للتعامل مع هذا؟بخلاف مطالبة المستخدم بعدم الضغط على هذه الأزرار؟عندما قمت بالتحقق آخر مرة، كان هناك شيء يسمى "ذاكرة التخزين المؤقت للاستجابة العمودية".عامل تصفية يحدد تفرد طلبك في الجلسة ويحاول إرسال استجابة مخبأة إذا كان الطلب مكررًا.هل هناك أي طرق أبسط لحل هذه المشكلة الكلاسيكية؟

فيما يلي رابط لحل ذاكرة التخزين المؤقت للاستجابة العمودية الذي كنت أتحدث عنه: http://www.fingo.info/en/articles/_1.html.ومع ذلك، فأنا لست متأكدًا من مدى نجاح هذا الأمر حقًا.

هل كانت مفيدة؟

المحلول

يعتقد المرء أن لدي هو تضمين معرف فريد (ربما سلسلة عشوائية) كحقل نموذج مخفي في النموذج الذي يتم تقديمه. يمكن وضع سلسلة معرف في قاعدة البيانات ك "معرف المعاملة". الآن، عندما تذهب لتحديث قاعدة البيانات، تحقق أولا ما إذا كان هناك سجل موجود مع معرف المعاملات المقدمة، وإذا كان الأمر كذلك، فافترض أنه مكررة ولا تغير قاعدة البيانات.

بالطبع، كما قلت، هذا مجرد فكرة. أنا لا أعرف ما هي الأساليب المستخدمة فعلا في الممارسة العملية. (أظن أن الكثير من المواقع الأقل أهمية تتجاهل المشكلة ونأمل أن يكون مستخدموهم ذكيا ... اقتراح خاسر إذا رأيت واحدة ؛-)

تعديل: كما هو مذكور في التعليقات، قد تأخذ تخزين معرفات المعاملات في قاعدة البيانات الكثير من المساحة، ولكن إذا كانت هذه مشكلة، فيمكنك الاحتفاظ بذاكرة التخزين المؤقت في الذاكرة لجميع معرفات المعاملات المعالجة في آخر 5 دقائق / ساعة / ساعة 1 يوم / أيا كان. يجب أن تعمل إلا إذا كنت ضد هاكر محدد ...

نصائح أخرى

نعم، أعتقد أنه يجب عليك إعادة توجيه بعد منشور، باستثناء طلبات API. دون القيام بذلك، لا داعي للقلق فقط بشأن الحصول على مشاركات مكررة عندما يستخدم المستخدم الزر الخلفي، ولكن المستعرض سيعطي أيضا مربعات الحوار المزعجة للمستخدم عند محاولة استخدام الزر الخلفي.

Response.sendredirect يعمل في الممارسة العملية، ولكن التحدث بلطفيا هذا يرسل رمز استجابة HTTP غير صحيح لهذا الغرض. Sendredirect يرسل 302، ولكن الرمز الصحيح للاستخدام لتحويل وظيفة إلى الحصول على 303. (ستعامل معظم المتصفحات 302 تماما مثل 303 إذا حصلوا عليها استجابة للنشر، ولكن

بشكل عام، تريد إعادة التوجيه لإرسال المستخدم إلى أي طريقة عرض سيعرض تأثير تغييرها. على سبيل المثال، إذا قاموا بتحرير عنصر واجهة مستخدم، فيجب إعادة توجيهها إلى عرض هذه القطعة. إذا حذفوا عنصر واجهة مستخدم، فيجب إعادة توجيهها إلى الرأي القائل بأن القطعة قد ظهرت عند وجودها (ربما قائمة القطعة).

في بعض الأحيان يكون من الجيد أن يكون لديك رسالة حالة لتعزيز السيارة إلى المنزل حقيقة حدوث إجراء. طريقة بسيطة للقيام بذلك هي أن يكون لها معلمة مشتركة لوجهات نظرك التي، عند التعيين، ستعرض رسالة مكتملة. على سبيل المثال:

/widget?id=12345&msg=Widget+modified.

هنا تحتوي المعلمة "Msg" على الرسالة "المعدلة المعدلة". الجانب الهبوطي لهذا النهج هو أنه قد يكون من الممكن للمواقع الضارة أن تعطي مستخدمي المستخدمين مربكة / مضللة. على سبيل المثال:

/account?msg=Foo+Corp.+hates+you.

إذا كنت قلقا حقا من هذا، فيمكنك تضمين توقيع تنتهي في الرسالة كمعلمة إضافية. إذا كان التوقيع غير صالح أو انتهت صلاحيته، فلا تعرض الرسالة.

أفضل حل لحل مشكلة إظهار رسائل الحالة إلى المستخدمين بعد منشور إعادة توجيه هو استخدام جلسات المستخدم.

كيف

أضف سمات إلى جلسة المستخدم مع القيمة كمجموعة من الرسائل المراد عرضها. على سبيل المثال.

userSession.put("success_messages", new HashSet<String>(){"Success", "Check your account balance"});
userSession.put("warning_messages", new HashSet<String>(){"Your account balance is low. Recharge immediately"});

ولديه مرشح يقوم بمسح جلسة المستخدم لهذه السمات المعينة ويخرج الرسائل. يجب أن يحذف المرشح السمات بعد القراءة مرة واحدة، حيث يتم عرض رسائل الحالة عموما مرة واحدة فقط.

أجد أنها مسلية إلى حد ما أن العديد من المواقع الآمنة (البنوك) / بوابات الدفع تميل إلى إبلاغ المستخدم عن طريق وضع نص على الشاشة، مثل "الرجاء عدم الضغط على أزرار الظهر / التحديث".

يجد بعض الأشخاص من الأفضل "تعطيل الحدث مرة أخرى في هذه الصفحات الحاسمة"؛ لست متأكدا مما إذا كان هذا جيدا أم لا.

ولكن حل عنوانك "ذاكرة التخزين المؤقت للاستجابة الرأسية"يبدو لطيفا

إنه غير واضح بعض الشيء ولكن:

  • إنشاء كائن مرتبط في جلسة المستخدم.
  • القيمة هي طلب + Java Future للنتيجة
  • العودة على الفور مع إعادة التوجيه من جانب العميل.
  • أثناء معالجة إعادة التوجيه من جانب العميل، اطلب من مؤشر ترابط عامل العمل على إنتاج الإجابة.

لذا، بحلول الوقت الذي يكمل فيه متصفح العميل عملية إعادة التوجيه، ويحصل على صور الصفحة الجديدة، وما إلى ذلك...النتائج في انتظار المستخدم.

البديل هو توعية المستخدم بشكل مؤلم بالمدة التي تستغرقها قاعدة البيانات.

التحديث الأمني ​​(24 يناير 2011):

المفتاح عرضة للهجوم لأنه جزء من الاستجابة للعميل

  1. إنشاء مفتاح عشوائي
  2. استخدم معرف جلسة المستخدم كملح لإنشاء SHA-1
  3. قم بتخزين كل من المفتاح العشوائي وSHA-1 في قاعدة البيانات باستخدام (، ) كمفتاح أساسي.(لا توجد فهرسة منفصلة على RANDOMKEY.
  4. استخدم كلاً من RANDOMKEY وSHA-1 كبحث في قاعدة البيانات.
  5. لا تقم بتخزين معرف الجلسة (تجنب مشكلات الخصوصية من خلال القدرة على مطابقة العديد من الإدخالات لنفس المستخدم)
  6. تنتهي النتائج بعد 2-3 أيام.(يسمح بمهمة دفعة يومية للقيام بالتنظيف ويتجنب خلق مشاكل لجلسات المستخدم التي تكون شبه طويلة الأمد)

تتطلب هذه الطريقة من أي متسلل معرفة معرف الجلسة والمفتاح العشوائي.

قد يبدو هذا الأسلوب مبالغًا فيه، ولكن يمكن استخدام آلية إعادة التوجيه المتشددة في مواقف مثل إعادة تعيين كلمة المرور.

إذا كنت تعمل مع البرمجة النصية بجانب Java Server وكذلك استخدام Struts 2، فأنت تشير إلى هذا الرابط الذي يتحدث عن استخدام الرمز المميز.

http://www.xinotes.org/notes/note/369/

يجب إنشاء الرمز المميز ويتم الاحتفاظ به في الجلسة في تقديم الصفحة الأولية، عندما يتم تقديم الطلب إلى جانب الرمز المميز لأول مرة، في إجراءات الدعامات تشغيل مؤشر ترابط مع اسم مؤشر الترابط كمعرف الرمز المميز وتشغيل المنطق مهما كان العميل مطلوب، عند إرسال العميل مرة أخرى نفس الطلب، تحقق ما إذا كان الخيط لا يزال قيد التشغيل (Thread.getCurrentThread (). إذا كان لا يزال قيد التشغيل ثم إرسال عميل إعادة توجيه 503.

يرجى إلقاء نظرة على ExecutioneDwaitErTectretrettor من الدعامات 2Code، ومنطق هذا جنبا إلى جنب مع الرمز المميز سيساعد في الضغط السريع

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top