منع التخزين المؤقت مستعرض مسج اياكس الاتصال النتيجة

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

سؤال

يبدو إذا كنت تحميل المحتوى الديناميكي باستخدام $.get(), النتيجة التخزين المؤقت في المتصفح.

إضافة بعض سلسلة عشوائية في QueryString يبدو أن حل هذه المسألة (يمكنني استخدام new Date().toString()), ولكن هذا يبدو وكأنه هاك.

هل هناك أي طريقة أخرى لتحقيق هذا ؟ أو إذا فريد من نوعه string هو السبيل الوحيد لتحقيق ذلك ، أي اقتراحات أخرى من new Date()?

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

المحلول

يمكنني استخدام new Date().getTime(), والتي سوف تجنب التصادم إلا إذا كان لديك طلبات متعددة يحدث داخل نفس ميلي ثانية واحدة:

$.get('/getdata?_=' + new Date().getTime(), function(data) {
    console.log(data); 
});

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

نصائح أخرى

وفيما يلي سوف يمنع جميع طلبات AJAX المستقبلية من يتم التخزين المؤقت، بغض النظر عن الطريقة التي مسج الذي تستخدمه ($. احصل على، $ .ajax، الخ.)

$.ajaxSetup({ cache: false });

و. احصل على $ مسج ل() سوف مؤقتا النتائج. بدلا من

$.get("myurl", myCallback)

ويجب عليك استخدام $ .ajax، والتي سوف تسمح لك لتحويل التخزين المؤقت قبالة:

$.ajax({url: "myurl", success: myCallback, cache: false});

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

response.setHeader( "Pragma", "no-cache" );
response.setHeader( "Cache-Control", "no-cache" );
response.setDateHeader( "Expires", 0 );

وجميع الإجابات هنا ترك بصمة على URL طلب والتي سوف تظهر في سجلات الدخول من الخادم.

وأنا في حاجة إلى حل قائم رأس مع أي أثر جانبي، ولقد وجدت أنه لا يمكن أن يتحقق من خلال إنشاء رؤوس المذكورة في <لأ href = "https://stackoverflow.com/questions/49547/making-sure-a- صفحات الإنترنت هو لا للمؤقتا في انحاء بين جميع المتصفحات "> كيفية التحكم التخزين المؤقت صفحة على شبكة الإنترنت، عبر جميع المتصفحات؟ .

والنتيجة، والعمل لكروم على الأقل، ستكون كما يلي:

$.ajax({
   url: url, 
   headers: {
     'Cache-Control': 'no-cache, no-store, must-revalidate', 
     'Pragma': 'no-cache', 
     'Expires': '0'
   }
});

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

وعادة ما تستخدم Math.random() ولكن لا أرى بأسا باستخدام التاريخ (لا يجب أن تفعل AJAX تطلب سريع بما فيه الكفاية للحصول على نفس القيمة مرتين).

وبعد وثائق: http://api.jquery.com/jquery.ajax/

ويمكنك استخدام خاصية cache مع:

$.ajax({
    method: "GET",
    url: "/Home/AddProduct?",
    data: { param1: value1, param2: value2},
    cache: false,
    success: function (result) {
        // TODO
    }
});

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

وبالطبع هذا لا يساعد إذا كان لديك أي سيطرة على الخادم.

وماذا عن استخدام طلب POST بدلا من GET ...؟ (التي يجب على أي حال ...)

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

وربما يجب أن ننظر في .ajax $ () بدلا من ذلك (إذا كنت تستخدم مسج، الذي يبدو). نلقي نظرة على: http://docs.jquery.com/Ajax/jQuery.ajax #options والخيار "مخبأ".

وثمة نهج آخر يتمثل في النظر في كيفية تخزين الأشياء على جانب الملقم.

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

وأنا متأكد من أن هناك سؤال آخر على SO من شأنها أن تعطي لك مجموعة كاملة من الرؤوس التي تكون مناسبة. أنا لست تماما conviced الرد miceus يغطي جميع القواعد 100٪.

لأولئك منكم باستخدام الخيار cache من $.ajaxSetup() على سفاري المحمول، ويبدو أنه قد تضطر إلى استخدام الطابع الزمني للوظائف، منذ سفاري المحمول تخزين ذلك أيضا. استنادا إلى وثائق على $.ajax() (والتي يتم توجيهك إلى من $.ajaxSetup()):

<اقتباس فقرة>   

ومخبأ إعداد إلى false سوف تعمل فقط بشكل صحيح مع الرأس والحصول على الطلبات. وهو يعمل عن طريق إلحاق "_ = {} الطابع الزمني" لمعلمات GET. ليست هناك حاجة المعلمة لأنواع أخرى من طلبات، ما عدا في IE8 عندما يتم إجراء POST إلى URL التي تم طلب بالفعل من GET.

وهكذا وضع هذا الخيار وحدها لن تساعدك في القضية التي ذكرتها أعلاه.

وفي الأساس مجرد إضافة cache:false; في اياكس حيث تعتقد أن المحتوى تتغير مع التقدم تستمر. والمكان الذي يوجد فيه محتوى متعود تغيير هناك ش يمكن إغفال هذا. وبهذه الطريقة سوف ش الحصول على استجابة جديدة في كل مرة

Internet Explorer اياكس التخزين المؤقت:ما أنت ذاهب إلى القيام به حيال ذلك ؟ يشير إلى ثلاثة أساليب:

  1. إضافة إلى ذاكرة التخزين المؤقت خرق رمزية إلى سلسلة الاستعلام ؟ تاريخ=[الطابع الزمني].في مسج و YUI يمكنك أن تقول لهم للقيام بذلك تلقائيا.
  2. استخدام وظيفة بدلا من الحصول على
  3. إرسال استجابة HTTP رأس يحظر تحديدا المتصفحات إلى ذاكرة التخزين المؤقت

والآن، فإنه من السهل أن تفعل ذلك من خلال تمكين / خيار التخزين المؤقت تعطيل في طلب اياكس الخاص بك، تماما مثل هذا

$(function () {
    var url = 'your url goes here';
    $('#ajaxButton').click(function (e) {
        $.ajax({
            url: url,
            data: {
                test: 'value'
            },
                cache: true, //cache enabled, false to reverse
                complete: doSomething
            });
        });
    });
    //ToDo after ajax call finishes
    function doSomething(data) {
        console.log(data);
    }
});

إذا كنت تستخدم IE 9، فأنت بحاجة إلى استخدام التالية أمام تعريف الفئة حدة التحكم الخاصة بك:

[OutputCache (NoStore = الحقيقية، مدة = 0، VaryByParam = "*")]

والطبقة العامة TestController: المراقب المالي

وهذا سيمنع المستعرض من التخزين المؤقت.

التفاصيل على هذا الرابط: HTTP: //dougwilsonsa.wordpress.com/2011/04/29/disabling-ie9-ajax-response-caching-asp-net-mvc-3-jquery/

والواقع هذا حل قضية بلدي.

وكما قالAthasach، وفقا لمستندات مسج، $.ajaxSetup({cache:false}) لن تعمل لغير GET و طلبات الرأس.

وكنت أفضل حالا ويرسلون رأس Cache-Control: no-cache من الخادم الخاص بك على أي حال. ويقدم الفصل أنظف من الشواغل.

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

إذا كنت تستخدم صافي ASP MVC، تعطيل التخزين المؤقت على عمل جهاز تحكم عن طريق إضافة السمة التالية على وظيفة نقطة النهاية: [OutputCacheAttribute (VaryByParam = "*"، المدة = 0، NoStore = صحيح)]

وإلحاق Math.random () لطلب رابط

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