تم تجاهل مفاوضات المحتوى عند استخدام الزر الخلفي للمتصفح

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

سؤال

ها هو الوضع:

لدي تطبيق ويب يرد على طلب للحصول على قائمة الموارد، دعنا نقول:

/items

يطلب هذا مبدئيا مباشرة بواسطة متصفح الويب عن طريق التنقل إلى هذا المسار. يستخدم المتصفح رأس "قبول" القياسي الذي يتضمن "نص / أتش تي أم أل، يلاحظ تطبيقي هذا وإرجاع محتوى HTML لقائمة العناصر.

داخل HTML الذي تم إرجاعه هو بعض JavaScript (jQuery)، والذي يقوم بعد ذلك بطلب طلب AJAX لاسترداد البيانات الفعلية:

/items

فقط هذه المرة، يتم تعيين رأس "قبول" صراحة على "التطبيق / JSON". مرة أخرى، يلاحظ طلبتي هذا ويتم إرجاع JSON بشكل صحيح إلى الطلب، يتم إدراج البيانات في الصفحة، وكل شيء سعداء.

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

حتى الآن أكدت أن هذا يحدث في كل من Google Chrome و Firefox 3.5.

هناك نوعان من الإجابات المحتملة هنا:

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

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

إذا كان ذلك يساعد، فإن التطبيق هو تطبيق Web Jax-RS، باستخدام الرؤية 2.0m4. يمكنني تقديم رؤوس طلب / استجابة عينة إذا كان مفيدا لكنني أعتقد أن القضية غير قابلة للتكرار تماما.

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

المحلول

هل هناك مزيج سحري لرؤوس التحكم في ذاكرة التخزين المؤقت، أو غيرها من الفودو الذي يتسبب في أن يفعل المتصفح الشيء الصحيح هنا؟

إذا كنت تخدم ردود مختلفة على قبول مختلف: الرؤوس، يجب عليك تضمين الرأس:

Vary: Accept

في ردكم. ال يتغير يجب أن يحتوي الرأس أيضا على أي رؤوس طلب أخرى تؤثر على الاستجابة، لذلك على سبيل المثال إذا قمت بالضغط Gzip / Dyplate، عليك تضمين ترميز قبول.

أي لسوء الحظ يعالج العديد من القيم Vary ضعيف، كسر الكاشطة تماما، مما قد لا يهمك أو لا يهمك.

إذا كنت تعتقد أنني أفعل شيئا خاطئا بشكل فظيع هنا، كيف يجب أن أذهب حول هذا؟

لا أعتقد أن فكرة خدمة محتوى مختلف لأنواع مختلفة في نفس عنوان URL مخطئ بشكل فظيع، لكنك تسمح نفسك بمشاكل توافق أكثر مما تحتاجه حقا. الاعتماد على رؤوس العمل من خلال JSON ليس حقا فكرة رائعة في الممارسة؛ كنت أفضل قبالة مجرد وجود عنوان URL مختلف، مثل /items/json أو /items?format=json.

نصائح أخرى

أعرف أن هذا السؤال قديم، ولكن فقط في حالة تشغيل أي شخص آخر في هذا:

كنت أواجه هذه المشكلة نفسها مع تطبيق القضبان باستخدام JQuery، وتم إصلاحه عن طريق إخبار المتصفح بعدم التخزين المؤقت استجابة JSON مع الحل المعطى هنا لسؤال مختلف:

JQuery $ .getjson يعمل مرة واحدة فقط لكل عنصر تحكم. لا تصل إلى الخادم مرة أخرى

يبدو أن المشكلة تحدث فقط مع Chrome و Firefox. كان Safari هو التعامل مع السلوك الخلفي بخير دون الاضطرار بشكل صريح إلى إخباره بعدم ذاكرة التخزين المؤقت.

السؤال القديم، ولكن بالنسبة لأي شخص آخر يرى ذلك، لا يوجد خطأ في استخدام السائل لرأس قبول.

هذا خطأ مؤكد في الكروم. (سابقا أيضا في فايرفوكس ولكن منذ الثابتة.)

http://code.google.com/p/chromium/issues/detail؟id=94369.

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