क्या iOS 6 पर सफारी $ .ajax परिणाम कैशिंग है?


1072

IOS 6 में अपग्रेड होने के बाद से, हम सफारी के वेब दृश्य को कैशिंग $.ajaxकॉल की स्वतंत्रता के रूप में देख रहे हैं। यह एक PhoneGap एप्लिकेशन के संदर्भ में है इसलिए यह Safari WebView का उपयोग कर रहा है। हमारी $.ajaxकॉल POSTविधियां हैं और हमारे पास कैश सेट झूठी है {cache:false}, लेकिन फिर भी यह हो रहा है। हमने TimeStampहेडर में मैन्युअल रूप से जोड़ने की कोशिश की लेकिन इससे कोई फायदा नहीं हुआ।

हमने अधिक शोध किया और पाया कि सफारी केवल वेब सेवाओं के लिए कैश्ड परिणाम लौटा रही है जिसमें एक फ़ंक्शन हस्ताक्षर है जो स्थिर है और कॉल से कॉल में परिवर्तित नहीं होता है। उदाहरण के लिए, एक फ़ंक्शन की कल्पना करें जिसे कुछ कहा जाता है:

getNewRecordID(intRecordType)

यह फ़ंक्शन एक ही इनपुट पैरामीटर को बार-बार प्राप्त करता है, लेकिन यह जो डेटा देता है वह हर बार अलग होना चाहिए।

IOS 6 ज़िप को प्रभावशाली बनाने के लिए Apple की जल्दबाजी में होना चाहिए क्योंकि वे कैश सेटिंग्स से बहुत खुश थे। आईओएस 6 पर किसी और के इस व्यवहार को देखा है? यदि हां, तो वास्तव में यह क्या कारण है?


हमें जो वर्कअराउंड मिला, वह फ़ंक्शन सिग्नेचर को इस तरह से संशोधित करना था:

getNewRecordID(intRecordType, strTimestamp)

और फिर हमेशा एक TimeStampपैरामीटर के रूप में अच्छी तरह से गुजरती हैं , और बस सर्वर पर उस मान को त्याग दें। इस मुद्दे के आसपास काम करता है। मुझे आशा है कि यह कुछ अन्य गरीब आत्मा की मदद करता है जो इस मुद्दे पर 15 घंटे बिताते हैं जैसे मैंने किया!


190
यह बिल्कुल चौंकाने वाला है। हमने अभी कुछ घंटे बिताए हैं, यह जानने की कोशिश कर रहे हैं कि क्या काम करना बंद कर दिया है। हमारा AJAX लॉगिन जो एक POST करता है (और कैशिंग को रोकने के लिए हेडर है) को Safari द्वारा कैश किया जा रहा है, इसलिए यह केवल उसी JSON को लौटाता है, जो पिछली बार भी सर्वर को आज़माए बिना किया था ... अविश्वसनीय! हमें एक फिक्स हैक करना होगा, लेकिन आपको कभी भी पोस्ट कैश नहीं करना चाहिए, यह पागल है।
कीरन

16
प्रश्न के अपडेट के बजाय अपने समाधान को उत्तर के रूप में पोस्ट करें।
ChrisF

50
पोस्ट रिक्वेस्ट नॉन-इम्पोटेंट हैं, जिसका मतलब है कि उन्हें कैश नहीं किया जाना चाहिए, जब तक कि प्रतिक्रिया विशेष रूप से अपने रिस्पांस हेडर के माध्यम से ऐसा करने की सलाह न दे
जेम्स एम। ग्रीन

6
इसे ठीक करने के लिए Apple प्राप्त करने के लिए, bugreport.apple.com पर एक बग दर्ज करें । मैंने वैसा ही किया है।
मथियास ब्यनेंस

11
मार्क नॉटिंघम (IETF HTTPbis वर्किंग ग्रुप की अध्यक्ष) ने आज इस बारे में एक दिलचस्प ब्लॉग पोस्ट लिखा: mnot.net/blog/2012/09/09/24/caching_POST
बेंजामिन ब्रेज़ी

जवाबों:


447

थोड़ी जांच के बाद, यह पता चलता है कि iOS6 पर सफारी POST को कैश करेगा जिसमें या तो कोई कैश-कंट्रोल हेडर नहीं है या यहां तक ​​कि "कैश-कंट्रोल: अधिकतम-आयु = 0" है।

जिस तरह से मैंने इस कैशिंग को वैश्विक स्तर पर होने से रोकने के बजाय सेवा कॉल के अंत में रैंडम क्वेरिस्ट्रिक्स को हैक करने के लिए कहा है वह है "कैश-कंट्रोल: नो-कैश" सेट करना।

इसलिए:

  • कोई कैश-कंट्रोल या एक्सपायर हेडर = iOS6 Safari कैश नहीं करेगा
  • कैश-कंट्रोल अधिकतम आयु = 0 और एक तत्काल समाप्ति = iOS6 सफारी कैश होगा
  • कैश-कंट्रोल: नो-कैश = iOS6 सफारी कैश नहीं करेगा

मुझे संदेह है कि Apple POST के बारे में धारा 9.5 में HTTP कल्पना से इसका लाभ उठा रहा है:

जब तक प्रतिक्रिया में उपयुक्त कैश-नियंत्रण या शीर्ष लेख फ़ील्ड शामिल नहीं होते हैं, तब तक इस विधि के लिए प्रतिक्रियाशील व्यवहार्य नहीं हैं। हालाँकि, 303 (अन्य देखें) प्रतिक्रिया का उपयोग उपयोगकर्ता एजेंट को निर्देश देने के लिए किया जा सकता है ताकि एक उपलब्ध संसाधन प्राप्त किया जा सके।

तो सिद्धांत रूप में आप POST प्रतिक्रियाओं को कैश कर सकते हैं ... कौन जानता था। लेकिन किसी भी अन्य ब्राउज़र निर्माता ने कभी नहीं सोचा था कि यह अब तक एक अच्छा विचार होगा। लेकिन कैशिंग के लिए कोई खाता नहीं है जब कोई कैश-कंट्रोल या एक्सपायर हेडर सेट नहीं होते हैं, केवल जब कुछ सेट होते हैं। तो यह एक बग होना चाहिए।

नीचे मैं अपने अपाचे कॉन्फिग के सही बिट में उपयोग करता हूं अपने पूरे एपीआई को लक्षित करने के लिए क्योंकि ऐसा होता है कि मैं वास्तव में कुछ भी कैश नहीं करना चाहता, यहां तक ​​कि प्राप्त करता है। मुझे नहीं पता कि यह केवल POST के लिए कैसे सेट किया जाता है।

Header set Cache-Control "no-cache"

अपडेट: बस ध्यान दिया कि मैंने यह इंगित नहीं किया कि यह केवल तब है जब POST समान है, इसलिए POST डेटा या URL में से कोई भी परिवर्तन करें और आप ठीक हैं। इसलिए आपको कहीं और उल्लेख किया जा सकता है बस URL या POST डेटा के कुछ यादृच्छिक डेटा जोड़ें।

अपडेट: आप अपाचे में इस तरह से "नो-कैश" सीमित कर सकते हैं यदि आप इस तरह चाहते हैं:

SetEnvIf Request_Method "POST" IS_POST
Header set Cache-Control "no-cache" env=IS_POST

7
मैं देखता हूं कि Apple इस के साथ कहां जा रहा है, लेकिन हम POST अनुरोधों के लिए कैश्ड प्रतिक्रियाओं को देख रहे हैं, यहां तक ​​कि जब हमारी प्रतिक्रियाओं में कोई कैशे-नियंत्रण या समाप्ति हेडर शामिल नहीं थे। क्या यह उदाहरण iOS6 को कैश नहीं करना चाहिए और हर अनुरोध भेजना चाहिए। यह नहीं हो रहा है।
कांगो_वी

138
आपके द्वारा उद्धृत HTTP कल्पना का हिस्सा iOS 6 के कैशिंग व्यवहार को सही नहीं ठहराता है। डिफ़ॉल्ट व्यवहार POST प्रतिक्रियाओं को कैश नहीं करना चाहिए (यानी जब "कैश-कंट्रोल" हेडर परिभाषित नहीं होता है)। व्यवहार कल्पना का उल्लंघन करता है और इसे बग माना जाना चाहिए। Xml / json api वेब सेवाओं का निर्माण करने वाले किसी भी व्यक्ति को इस मुद्दे पर काम करने के लिए "कैश-कंट्रोल: नो-कैश" के साथ अपनी POST प्रतिक्रियाओं को सजाना चाहिए।
डेविड एच।

39
पोस्ट रिक्वेस्ट नॉन-इम्पोटेंट हैं, जिसका मतलब है कि उन्हें कैश नहीं किया जाना चाहिए, जब तक कि प्रतिक्रिया विशेष रूप से अपने रिस्पांस हेडर के माध्यम से ऐसा करने की सलाह न दे
जेम्स एम। ग्रीन

4
जैसा कि डेविड कहते हैं, यह आपके द्वारा उद्धृत वाक्य का स्पष्ट उल्लंघन है। यदि कोई "कैश-कंट्रोल या एक्सपायर हेडर फ़ील्ड" नहीं है, तो उपयुक्त ऐसे हेडर स्पष्ट रूप से शामिल नहीं हैं। फिर भी आपकी खुद की जांच से यह पता चलता है कि यह उस परिदृश्य में है। कृपया अपना उत्तर संपादित करें।
मैथ्यू फ्लैशेन

3
क्या किसी को पता है कि डिवाइस पर रिजल्ट कितने समय में कैश हो जाता है? मैंने सफारी को मारने और अपने फोन को फिर से चालू करने की कोशिश की है, लेकिन यह अभी भी कैश्ड है। मुझे पता है कि यह ब्राउज़र कैश को साफ करने के साथ काम करता है, लेकिन मैं सोच रहा हूं कि उपयोगकर्ताओं के लिए कितना समय लगेगा जो एक बार चले जाने से पहले समस्या थी। हर कोई अपने कैश को साफ करने के बारे में नहीं सोचेगा ...
डैनियल हल्कविस्ट

146

मुझे आशा है कि यह इस एक पर दीवार के खिलाफ अपने सिर पीटने अन्य डेवलपर्स के लिए उपयोग किया जा सकता है। मैंने पाया कि निम्न में से कोई भी IOS 6 पर सफारी को POST प्रतिक्रिया को कैशिंग से रोकता है:

  • अनुरोध हेडर में [कैश-कंट्रोल: नो-कैश] जोड़ना
  • वर्तमान समय जैसे परिवर्तनशील URL पैरामीटर को जोड़ना
  • प्रतिक्रिया हेडर में [प्राग्मा: नो-कैश] जोड़ना
  • प्रतिक्रिया हेडर में [कैश-कंट्रोल: नो-कैश] जोड़ना

मेरे जावास्क्रिप्ट में मेरा समाधान निम्नलिखित था (मेरे सभी AJAX अनुरोध POST हैं)।

$.ajaxSetup({
    type: 'POST',
    headers: { "cache-control": "no-cache" }
});

मैं अपने कई सर्वर प्रतिक्रियाओं के लिए [प्राग: नो-कैश] हेडर भी जोड़ता हूं।

यदि आप उपरोक्त समाधान का उपयोग करते हैं, तो अवगत रहें कि कोई भी $ .ajax () कॉल जो आप बनाते हैं जो वैश्विक पर सेट हैं: गलत $ .ajaxSetup () में निर्दिष्ट सेटिंग्स का उपयोग नहीं करेगा, इसलिए आपको हेडर को फिर से जोड़ना होगा।


4
यह बग के लिए सही समाधान है। बग यह है कि iOS 6 सर्वर से भेजने के बजाय इसे कैश से POST अनुरोधों को सेवा देगा। बग यह नहीं है कि यह POST अनुरोधों (जो अनुमति है) से प्रतिक्रियाओं को कैश करता है। यदि आप अभी भी उस URI के बाद के GET अनुरोधों के लिए कैश से पुनर्प्राप्त POST अनुरोधों का जवाब चाहते हैं, तो इस समाधान का उपयोग करें।
निकोलस शैंक्स

2
यह मेरे लिए काम करता है, लेकिन मुझे समझ नहीं आता कि कैसे। मैंने पहले ही कैश निर्दिष्ट कर दिया था: मेरे ajaxSetup में गलत, और अनुरोध हेडर को देखकर, जो कैश-कंट्रोल के लिए उबलता है: नो-कैश और प्राग्मा: नो-कैश - लेकिन यह अभी भी iPad पर कैश करेगा। फिर जब मैं हेडर जोड़ता हूं: {"कैश-कंट्रोल": "नो-कैश"} ajaxSetup में, यह कैश-कंट्रोल हेडर को "नो-कैश, नो-कैश" होने के लिए दोगुना कर देता है - और कैशिंग को रोकता है। यहाँ क्या हो रहा है?
टॉम डब्ल्यू हॉल

पूरी तरह से काम करता है - आप अनुरोध को एक पैरामीटर $ .ajax ({प्रकार: ax POST ’, हेडर: {: कैश-कंट्रोल’:-नो-कैश ’}, आदि) के रूप में भी जोड़ सकते हैं
जॉर्ज फिलिपिपोस

[प्राग्मा: नो-कैश] क्या है? प्राग्मा कुंजी किसके लिए प्रयोग की जाती है?
झाकियाँ

मुझे भी लगता है कि यह एक अतिरिक्त पैरामीटर के साथ वर्कअराउंड के बजाय सबसे अच्छा तरीका है। हमने इसे केवल उन कॉल्स पर जोड़ा है जहां हमें इसकी आवश्यकता थी, उन कॉल्स के लिए जिनमें हमेशा एक ही रिटर्न होता है, कैशिंग शायद अंतिम उपयोगकर्ता के लिए एक अच्छी बात है।
जर्मनीकवि २०'१३

67

अपने सभी वेब सेवा अनुरोधों के लिए सरल समाधान, यह मानते हुए कि आप jQuery का उपयोग कर रहे हैं:

$.ajaxPrefilter(function (options, originalOptions, jqXHR) {
    // you can use originalOptions.type || options.type to restrict specific type of requests
    options.data = jQuery.param($.extend(originalOptions.data||{}, { 
      timeStamp: new Date().getTime()
    }));
});

JQuery prefilter कॉल के बारे में और अधिक पढ़ें यहाँ

यदि आप jQuery का उपयोग नहीं कर रहे हैं, तो अपनी पसंद की लाइब्रेरी के लिए डॉक्स जांचें। उनकी समान कार्यक्षमता हो सकती है।


3
यह मेरे लिए काम नहीं करता है, सर्वर जवाब देता है: "अमान्य आदिम JSON: timeStamp" asp.net / iis 7.5
एलेक्जेंडर

3
$ .ajax ({"cache": false ...}) के बारे में क्या? क्या यह काम करेगा क्योंकि यह एक _ = [TIMESTAMP] को जोड़ देगा? (मैं इसे परीक्षण करने के लिए नहीं खुद इस तरह के एक उपकरण है)
Karussell

मैंने कारसेल द्वारा प्रस्तावित समाधान का पूर्ण कार्यान्वयन पोस्ट किया है। नीचे मेरा जवाब देखें।
सैम शील्स

1
@Karussell। बस $ .ajax ({"कैश": गलत ...}) सेट करने की कोशिश की। यह iOS6 पर POST अनुरोधों के लिए समस्या का समाधान नहीं करता है। शायद इसलिए कि उनके डॉक्स के अनुसार JQuery कोई ब्राउज़र नहीं मानता है पोस्ट अनुरोध कैश करने के लिए काफी बेवकूफ है। "POST के साथ लाए गए पृष्ठों को कभी कैश नहीं किया जाता है, इसलिए कैश और ifModified विकल्प jQuery.ajaxSetup () में इन अनुरोधों पर कोई प्रभाव नहीं पड़ता है।"
ब्रेट हन्नाह

1
यह काम नहीं करता है। यह पोस्ट पैरामीटर को मर्ज नहीं करता है। डेव द्वारा पोस्ट एक बेहतर समाधान है।
क्रिस मुंच

43

मैं सिर्फ इस मुद्दे के साथ एक PhoneGap आवेदन में था। मैंने getTime()निम्नलिखित तरीके से जावास्क्रिप्ट फ़ंक्शन का उपयोग करके इसे हल किया :

var currentTime = new Date();
var n = currentTime.getTime();
postUrl = "http://www.example.com/test.php?nocache="+n;
$.post(postUrl, callbackFunction);

मैंने कुछ घंटे बर्बाद कर दिए। इस कैशिंग मुद्दे के डेवलपर्स को सूचित करना Apple का अच्छा रहा होगा।


1
मैं या {cache:false}तो एक विकल्प के रूप में उपयोग करने पर टिप्पणी करने जा रहा था , लेकिन डॉक्स के अनुसार , इन तर्कों को अनदेखा किया जाता है; jQuery पोस्ट अनुरोधों को कभी 'कैश नहीं करेगा', लेकिन ब्राउज़र को ध्यान में नहीं रखता है। संभवत: उपयोग करने के अनुरोधों के लिए टाइमस्टैम्प जोड़ने के लिए एक नीटर विकल्प होगा । $.post()$.ajaxSetup()$.ajaxPrefilter()
fwielstra

मैं इस मुद्दे को ठीक करने के लिए लगभग 5 घंटे का समय बिताता हूं, और आखिरकार टाइमस्टैम्प जोड़ने से चाल function send_ajax(my_data,refresh)
चलेगी

42

मुझे एक ही समस्या थी कि एक webapp को ASP.NET वेबसर्विस से डेटा मिलता है

यह मेरे लिए काम किया:

public WebService()
{
    HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
    ...
}

2
आपका बहुत बहुत धन्यवाद! मैं यह जानने की कोशिश कर रहा था कि आईफोन हर दूसरे प्लेटफॉर्म से अलग क्यों काम कर रहा है। इस ASP.NET- विशिष्ट समाधान ने मुझे एक टन बचाया।
मार्क ब्रिटिंघम

IOS6 पर काम करने के लिए धागा के अंत की ओर मेरा जवाब नहीं देखा
ब्रायन Ogden

1
कृप्या!!!! केवल IOS 6 पर इसे लागू करने के लिए एक शर्त रखें, सामग्री कैश किसी भी एप्लिकेशन के लिए महत्वपूर्ण है।
अलेक्जेंड्रे

24

अंत में, मुझे अपनी अपलोडिंग समस्या का हल मिल गया है।

जावास्क्रिप्ट में:

var xhr = new XMLHttpRequest();
xhr.open("post", 'uploader.php', true);
xhr.setRequestHeader("pragma", "no-cache");

में पीएचपी :

header('cache-control: no-cache');

15

मेरे अपने ब्लॉग पोस्ट से iOS 6.0 कैशिंग अजाक्स POST अनुरोध :

इसे कैसे ठीक करें: अनुरोधों के कैशिंग को रोकने के लिए विभिन्न तरीके हैं। अनुशंसित विधि एक नो-कैश हेडर जोड़ रही है। ऐसा ही किया जाता है।

jQuery:

IOS 6.0 की जाँच करें और इस तरह अजाक्स हेडर सेट करें:

$.ajaxSetup({ cache: false });

ZeptoJS:

IOS 6.0 के लिए जांचें और अजाक्स हेडर को इस तरह सेट करें:

$.ajax({
    type: 'POST',
    headers : { "cache-control": "no-cache" },
    url : ,
    data:,
    dataType : 'json',
    success : function(responseText) {…}

सर्वर साइड

जावा:

httpResponse.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");

क्लाइंट को कोई भी डेटा भेजे जाने से पहले इसे शीर्ष पृष्ठ पर जोड़ना सुनिश्चित करें।

नेट

Response.Cache.SetNoStore();

या

Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache);

पीएचपी

header('Cache-Control: no-cache, no-store, must-revalidate'); // HTTP 1.1.
header('Pragma: no-cache'); // HTTP 1.0.


7

यह जावास्क्रिप्ट स्निपेट jQuery और jQuery मोबाइल के साथ शानदार काम करता है:

$.ajaxSetup({
    cache: false,
    headers: {
        'Cache-Control': 'no-cache'
    }
});

इसे अपने जावास्क्रिप्ट कोड में कहीं रखें (jQuery लोड होने के बाद, और AJAX अनुरोध करने से पहले सबसे अच्छा) और इसे मदद करनी चाहिए।


6

आप इस मुद्दे को अजाक्स फ़ंक्शन के शीर्ष पर निम्न (1.7.1 के रूप में) करके jQuery Ajax फ़ंक्शन को संशोधित करके भी ठीक कर सकते हैं (फ़ंक्शन लाइन 7212 से शुरू होता है)। यह परिवर्तन सभी पोस्ट अनुरोधों के लिए jQuery के अंतर्निहित एंटी-कैश सुविधा को सक्रिय करेगा।

(पूरी स्क्रिप्ट उपलब्ध है http://dl.dropbox.com/u/58016866/jquery-1.7.1.js।)

नीचे पंक्ति 7221 डालें:

if (options.type === "POST") {
    options.cache = false;
}

फिर निम्नलिखित को संशोधित करें (पंक्ति ~ 7497 पर शुरू)।

if (!s.hasContent) {
    // If data is available, append data to URL
    if (s.data) {
        s.url += (rquery.test(s.url) ? "&" : "?") + s.data;
        // #9682: remove data so that it's not used in an eventual retry
        delete s.data;
    }

    // Get ifModifiedKey before adding the anti-cache parameter
    ifModifiedKey = s.url;

    // Add anti-cache in URL if needed
    if (s.cache === false) {
        var ts = jQuery.now(),
        // Try replacing _= if it is there
        ret = s.url.replace(rts, "$1_=" + ts);

        // If nothing was replaced, add timestamp to the end.
        s.url = ret + ((ret === s.url) ? (rquery.test(s.url) ? "&" : "?") + "_=" + ts : "");
    }
}

सेवा:

// More options handling for requests with no content
if (!s.hasContent) {
    // If data is available, append data to URL
    if (s.data) {
        s.url += (rquery.test(s.url) ? "&" : "?") + s.data;
        // #9682: remove data so that it's not used in an eventual retry
        delete s.data;
    }

    // Get ifModifiedKey before adding the anti-cache parameter
    ifModifiedKey = s.url;
}

// Add anti-cache in URL if needed
if (s.cache === false) {
    var ts = jQuery.now(),
    // Try replacing _= if it is there
    ret = s.url.replace(rts, "$1_=" + ts);

    // If nothing was replaced, add timestamp to the end.
    s.url = ret + ((ret === s.url) ? (rquery.test(s.url) ? "&" : "?") + "_=" + ts : "");
}

4
यह jQuery को बदलने या उस मामले के लिए कोई अच्छा तरीका नहीं है जो आपके पास नहीं है। (हर बार जब आप संस्करण को अपडेट करना चाहते हैं तो आपको फिर से बदलाव करना होगा। (या किसी अन्य डेवलपर अपडेट और प्रोग्राम काम नहीं करता है))
andlrc

यदि आप Apple की मूर्खता को कम करने के लिए सबसे तेज़ संभव समाधान की आवश्यकता है, तो यह पूरी तरह से मान्य दृष्टिकोण है। इस समाधान का उपयोग एक विशाल साइट के लिए समस्या को हल करने के लिए किया गया है जो एक दिन में लाखों हिट प्राप्त करता है और इसने हमें केवल एक फ़ाइल में बदलाव करके इसे करने में सक्षम किया।
सैम शाइल्स

आप इसे देखने से jQuery.ajaxPrefilerपहले अपने ajax अनुरोध को संशोधित करने की अनुमति दे सकते हैं। आप अधिक अनुकूलित और अद्यतन सुरक्षित कोड के साथ ही संग्रह कर सकते हैं।
andlrc

1
प्रीफ़िल्टर दृष्टिकोण के साथ समस्या यह है कि आपको फ़िल्टर को पंजीकृत करने की आवश्यकता है। यदि आपके पास एक सामान्य स्क्रिप्ट है जो प्रत्येक पृष्ठ लोड होने पर चलती है, तो ठीक है, लेकिन यदि आप नहीं करते हैं तो आपको एजाक्स का उपयोग करने वाले प्रत्येक पृष्ठ के लिए प्रीफिल्टर को सेटअप करना होगा। जिस परिदृश्य का मैंने सामना किया, हमारे पास JQ फ़ाइल के लिए एक सामान्य स्थान था जो 7+ व्यक्तिगत वेब साइटों के लिए संसाधन के रूप में उपयोग किया गया था। इस बग के कारण हमें प्रति घंटे हजारों पाउंड का नुकसान हो रहा था और जिस दृष्टिकोण को मैंने सुझाया था, उसने इस फाइल को बदलकर कम से कम समय में इसे हल करने में सक्षम बनाया। मैं आपके साथ प्रिंसिपल में सहमत हूं लेकिन आपको कभी-कभी व्यावहारिक होना चाहिए!
बजे सैम शाइल्स

फिर आप इसे उस फ़ाइल के अंत में जोड़ सकते हैं। अच्छा है कि आप इसे हल कर लें, आपकी कंपनी को आपके लिए खुश होना चाहिए।
andlrc

5

GWT-RPC सेवाओं के लिए एक त्वरित काम के आसपास सभी दूरस्थ तरीकों से इसे जोड़ना है:

getThreadLocalResponse().setHeader("Cache-Control", "no-cache");

हममें से अधिकांश के पास GWT की तैनाती में सैकड़ों दूरस्थ तरीके हैं। क्या सभी अनुरोधों के लिए कैश कंट्रोल हेडर सेट करने का एक सार्वभौमिक तरीका है?
dirkoneill

5

यह Baz1nga के उत्तर का एक अद्यतन है। चूंकि options.dataकोई वस्तु नहीं है, लेकिन एक स्ट्रिंग मैंने सिर्फ टाइमस्टैम्प को बदलने के लिए सहारा लिया है:

$.ajaxPrefilter(function (options, originalOptions, jqXHR) {
  if (originalOptions.type == "post" || options.type == "post") {

    if (options.data && options.data.length)
      options.data += "&";
    else
      options.data = "";

    options.data += "timeStamp=" + new Date().getTime();
  }
});

1
टाइमस्टैम्प जोड़ना एक बुरा विचार है, इसके बजाय डेव के समाधान का प्रयास करें।
निकोलस शैंक्स

4

WebApps के लिए इस समस्या को होम स्क्रीन पर हल करने के लिए, शीर्ष वोट किए गए दोनों वर्कअराउंड का पालन करने की आवश्यकता है। कैशिंग को नए अनुरोधों को बंद किए जाने से रोकने के लिए वेबसर्वर पर बंद करने की आवश्यकता है और अनुरोधों के लिए प्रत्येक पोस्ट अनुरोध में कुछ यादृच्छिक इनपुट को जोड़ने की आवश्यकता है जो पहले से ही गुजर चुके हैं। कृपया मेरी पोस्ट देखें:

iOS6 - क्या वेब स्क्रीन के लिए होम स्क्रीन पर जोड़े गए ajax POST अनुरोधों को साफ करने का एक तरीका है?

चेतावनी: सर्वर पर कैशिंग को बंद किए बिना उनके अनुरोध में टाइमस्टैम्प जोड़कर कार्यबल लागू करने वाले किसी को भी। अगर आपके ऐप को होम स्क्रीन पर जोड़ा जाता है, तो हर पोस्ट का जवाब अब कैश हो जाएगा, सफारी कैश क्लियर करने से यह स्पष्ट नहीं होता है और यह समाप्त नहीं होता है। जब तक किसी के पास इसे खाली करने का कोई तरीका नहीं है, यह एक संभावित मेमोरी लीक जैसा दिखता है!


क्या सभी प्रतिक्रियाओं को फोन पर फ़ाइल या मेमोरी में कैश किया जाएगा?
Eydun

मेरे साथ ऐसा नहीं था। मैंने अपने url (पोस्ट पैरामीटर नहीं) पर टाइम स्टैम्प लगाया और यह ठीक काम करता है, जब सफारी से ब्राउज़ करते समय और होम स्क्रीन पर सहेजते समय दोनों।
ShadeTreeDeveloper

4

ऐसी चीजें जो मेरे लिए iPad 4 / iOS 6 के साथ काम नहीं करती हैं :

मेरा अनुरोध है: कैश-कंट्रोल: नो-कैश

//asp.net's:
HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache)

कैश जोड़ना: मेरे jQuery के अजाक्स कॉल के लिए गलत है

 $.ajax(
        {
            url: postUrl,
            type: "POST",
            cache: false,
            ...

केवल इसने किया चाल:

var currentTime = new Date();
var n = currentTime.getTime();
postUrl = "http://www.example.com/test.php?nocache="+n;
$.post(postUrl, callbackFunction);

डाउन वोट किसके लिए है? यह महत्वपूर्ण सूचना कैश है: झूठी iPad4 / iOS6 के साथ काम नहीं करता है और न ही //asp.net का: HttpContext.Current.Response.Cache.SetCacheability (HttpCacheability.Noadache)
ब्रायन ओग्डेन

पश्चात के लिए: 2017 तक, $.ajax cache: falseurl को क्वेरी पैरामीटर के साथ जोड़ देता है _=Date.prototype.getTime(), इसलिए मैन्युअल रूप से टाइमस्टैम्प को जोड़ने की अब आवश्यकता नहीं होनी चाहिए।
काबर्ट

3

GWT-RPC के लिए यही काम है

class AuthenticatingRequestBuilder extends RpcRequestBuilder 
{
       @Override
       protected RequestBuilder doCreate(String serviceEntryPoint) 
       {
               RequestBuilder requestBuilder = super.doCreate(serviceEntryPoint);           
               requestBuilder.setHeader("Cache-Control", "no-cache");

               return requestBuilder;
       }
}

AuthenticatingRequestBuilder builder = new AuthenticatingRequestBuilder();
((ServiceDefTarget)myService).setRpcRequestBuilder(builder);    


1

अनुरोध को अलग दिखने के लिए कैश-बस्टर मापदंडों को जोड़ने पर एक ठोस समाधान जैसा लगता है, मैं इसके खिलाफ सलाह दूंगा, क्योंकि यह किसी भी एप्लिकेशन को चोट पहुंचाएगा जो वास्तविक कैशिंग लेने पर निर्भर करता है। एपीआई आउटपुट को सही हेडर बनाना सबसे अच्छा संभव समाधान है, भले ही यह कॉल करने वालों को कैश बस्टर जोड़ने की तुलना में थोड़ा अधिक कठिन हो।


1
जब भी मैं आपकी अधिकांश परिस्थितियों से सहमत होता, मैं तर्क देता कि इस समस्या का वास्तविक समाधान Apple के लिए HTTP को सही ढंग से लागू करने के लिए है। इसे ध्यान में रखते हुए, मैं उस समय तक सरलतम संभव समाधान को लागू करने के लिए बहुत सारे डेवलपर्स को दोष नहीं दूंगा। मेरे लिए, jquery कार्यान्वयन को संशोधित करना एक सरलतम समाधान था क्योंकि इसने मुझे एक संपादन करने की अनुमति दी और आश्वस्त था कि यह मेरी पूरी साइट के लिए सक्रिय था।
सैम शील्स

1

उपयोग करने वालों के लिए Struts 1, यहाँ बताया गया है कि मैंने इस मुद्दे को कैसे तय किया।

web.xml

<filter>
    <filter-name>SetCacheControl</filter-name>
    <filter-class>com.example.struts.filters.CacheControlFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>SetCacheControl</filter-name>
    <url-pattern>*.do</url-pattern>
    <http-method>POST</http-method>
</filter-mapping>

com.example.struts.filters.CacheControlFilter.js

package com.example.struts.filters;

import java.io.IOException;
import java.util.Date;
import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;

public class CacheControlFilter implements Filter {

        public void doFilter(ServletRequest request, ServletResponse response,
                     FilterChain chain) throws IOException, ServletException {

        HttpServletResponse resp = (HttpServletResponse) response;
        resp.setHeader("Expires", "Mon, 18 Jun 1973 18:00:00 GMT");
        resp.setHeader("Last-Modified", new Date().toString());
        resp.setHeader("Cache-Control", "no-store, no-cache, must-revalidate, max-age=0, post-check=0, pre-check=0");
        resp.setHeader("Pragma", "no-cache");

        chain.doFilter(request, response);
    }

    public void init(FilterConfig filterConfig) throws ServletException {
    }

    public void destroy() {
    }

}

1

मैं $ .ajaxSetup के संयोजन का उपयोग करके अपनी समस्या को ठीक करने में सक्षम था और अपनी पोस्ट के url (पोस्ट मापदंडों / निकाय को नहीं) के टाइमस्टैम्प को जोड़ रहा था। यह पिछले उत्तरों की सिफारिशों पर आधारित है

$(document).ready(function(){
    $.ajaxSetup({ type:'POST', headers: {"cache-control","no-cache"}});

    $('#myForm').submit(function() {
        var data = $('#myForm').serialize();
        var now = new Date();
        var n = now.getTime();
        $.ajax({
            type: 'POST',
            url: 'myendpoint.cfc?method=login&time='+n,
            data: data,
            success: function(results){
                if(results.success) {
                    window.location = 'app.cfm';
                } else {
                    console.log(results);
                    alert('login failed');
                }
            }
        });
    });
});

1

मुझे लगता है कि आपने पहले ही अपना मुद्दा सुलझा लिया है, लेकिन मुझे वेब कैशिंग के बारे में एक विचार साझा करने दें।

यह सच है कि आप अपने द्वारा उपयोग की जाने वाली प्रत्येक भाषा में कई हेडर जोड़ सकते हैं, सर्वर साइड, क्लाइंट साइड, और आप वेब कैशिंग से बचने के लिए कई अन्य ट्रिक्स का उपयोग कर सकते हैं, लेकिन हमेशा सोचें कि आप कभी भी यह नहीं जान सकते कि क्लाइंट आपके सर्वर से कनेक्ट हो रहा है, आप कभी नहीं जानते कि वह एक होटल "हॉट-स्पॉट" कनेक्शन का उपयोग कर रहा है जो स्क्वीड या अन्य कैशिंग उत्पादों का उपयोग करता है।

यदि उपयोगकर्ता अपनी वास्तविक स्थिति को छिपाने के लिए प्रॉक्सी का उपयोग कर रहे हैं, आदि ... कैशिंग से बचने का वास्तविक एकमात्र तरीका अनुरोध में टाइमस्टैम्प भी है यदि अप्रयुक्त है।

उदाहरण के लिए:

/ajax_helper.php?ts=3211321456

फिर हर कैश मैनेजर को आपको कैश रिपॉजिटरी में एक ही यूआरएल ढूंढना होगा और पेज कंटेंट को फिर से डाउनलोड करना होगा।


पुराना उत्तर, लेकिन मेरे दो सेंट: यह आमतौर पर अच्छी सलाह है और सबसे सक्षम वेब डेवलपर्स द्वारा समझी जाती है, लेकिन jQuery के विशिष्ट मामले में, यदि आप एक बनाते हैं $.ajaxऔर आपके पास विकल्प हैं, {cache:false}तो jQuery अपने आप कैश-बस्टिंग जोड़ देगा तुम्हारे बिना पर्दे के पीछे कभी कुछ और करने की जरूरत नहीं है।
जेकगोल्ड

0

ऐप के आधार पर आप सफारी> एडवांस्ड> वेब इंस्पेक्टर का उपयोग करके आईओएस 6 में अब समस्या को शूट कर सकते हैं ताकि इस स्थिति में मदद मिल सके।

मैक पर फोन को सफारी से कनेक्ट करें फिर वेब ऐप को शूट करने में परेशानी के लिए डेवलपर मेनू का उपयोग करें।

IOS6 में अपडेट के बाद iPhone पर वेबसाइट डेटा को साफ़ करें, जिसमें वेब व्यू का उपयोग करके ऐप के लिए विशिष्ट भी शामिल है। केवल एक ऐप में एक समस्या थी और इसे IOS6 बीटा परीक्षण के दौरान वापस हल किया, तब से कोई वास्तविक समस्या नहीं है।

आपको अपने ऐप को देखने की आवश्यकता हो सकती है, अगर कस्टम ऐप में किसी WebView में NSURLCache की जाँच करें।

https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSURLCache_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40003754

मुझे लगता है कि आपकी समस्या, कार्यान्वयन, आदि की वास्तविक प्रकृति के आधार पर।

Ref: $ .ajax कॉल


हालांकि यह सीधे मूल प्रश्न को संबोधित नहीं करता है, यह सामान्य रूप से ऑन-डिवाइस समस्याओं का निवारण करने में सक्षम होने के लिए बहुत उपयोगी जानकारी है, इसलिए मैं इसे अप-वोट कर रहा हूं।
क्रिस ग्रिसिंग

0

मुझे एक वर्कअराउंड मिला जो मुझे उत्सुक बनाता है कि यह क्यों काम करता है। एएसपी.नेट वेब सेवा से संबंधित तडेज के उत्तर को पढ़ने से पहले, मैं कुछ ऐसा करने की कोशिश कर रहा था जो काम करेगा।

और मैं यह नहीं कह रहा हूं कि यह एक अच्छा समाधान है, लेकिन मैं इसे यहां दस्तावेज बनाना चाहता था।

मुख्य पृष्ठ: एक जावास्क्रिप्ट फ़ंक्शन, चेकस्टैटस () शामिल हैं। विधि एक अन्य विधि को कॉल करती है जो HTML सामग्री को अपडेट करने के लिए एक jQuery AJAX कॉल का उपयोग करती है। मैंने checkStatus () को कॉल करने के लिए setInterval का उपयोग किया। बेशक, मैं कैशिंग समस्या में भाग गया।

समाधान: अद्यतन को कॉल करने के लिए किसी अन्य पृष्ठ का उपयोग करें।

मुख्य पृष्ठ पर, मैंने एक बूलियन वैरिएबल, रनअपडेट सेट किया, और निम्नलिखित को बॉडी टैग में जोड़ा:

<iframe src="helper.html" style="display: none; visibility: hidden;"></iframe>

सहायक पृष्ठ में:

<meta http-equiv="refresh" content="5">
<script type="text/javascript">
    if (parent.runUpdate) { parent.checkStatus(); }
</script>

इसलिए, अगर checkStatus () को मुख्य पृष्ठ से कहा जाता है, तो मुझे कैश्ड सामग्री मिलती है। अगर मैं चाइल्ड पेज से चेकस्टैटस को कॉल करता हूं, तो मुझे अपडेटेड कंटेंट मिलता है।


0

जबकि मेरे लॉगिन और साइनअप पृष्ठ फ़ायरफ़ॉक्स, IE और क्रोम में एक आकर्षण की तरह काम करते हैं ... मैं IOS और OSX के लिए सफारी में इस मुद्दे से जूझ रहा था, कुछ महीने पहले मुझे एसओ पर वर्कअराउंड मिला।

<body onunload="">

या जावास्क्रिप्ट के माध्यम से

<script type="text/javascript">
window.onunload = function(e){
    e.preventDefault();
    return;
};
</script>   

यह थोड़े बदसूरत चीज है लेकिन थोड़ी देर के लिए काम करता है।

मुझे पता नहीं क्यों, लेकिन इस onunloadघटना के लिए पृष्ठ पर वापस लौटने पर सफारी में कैश नहीं किया जाता है।


0

हमने पाया कि पुराने iPhones और iPads, iOS वर्जन 9 & 10 चला रहे हैं, कभी-कभी फर्जी खाली AJAX परिणाम देते हैं, शायद Apple के CPU की गति कम होने के कारण। रिक्त परिणाम देते समय, iOS सर्वर को कॉल नहीं करता है, जैसे कि कैश से परिणाम लौटाते हैं। फ्रीक्वेंसी व्यापक रूप से भिन्न होती है, लगभग 10% से 30% तक AJAX कॉल वापस आती हैं।

समाधान विश्वास करना कठिन है। बस 1s प्रतीक्षा करें और फिर से कॉल करें। हमारे परीक्षण में, केवल एक ही दोहराव था जिसकी कभी आवश्यकता थी, लेकिन हमने 4 बार कॉल करने के लिए कोड लिखा था। हमें यकीन नहीं है कि 1s प्रतीक्षा की आवश्यकता है, लेकिन हम बार-बार कॉल के फटने के साथ हमारे सर्वर पर बोझ डालना नहीं चाहते थे।

हमने पाया कि समस्या दो अलग-अलग AJAX कॉलों के साथ हुई, अलग-अलग डेटा वाली API फ़ाइलों पर कॉल करने की। लेकिन मुझे चिंता है कि यह किसी भी AJAX कॉल पर हो सकता है। हम सिर्फ इसलिए नहीं जानते क्योंकि हम हर AJAX परिणाम का निरीक्षण नहीं करते हैं और हम पुराने उपकरणों पर कई बार हर कॉल का परीक्षण नहीं करते हैं।

दोनों समस्या AJAX कॉल का उपयोग कर रहे थे: POST, Asynchronously = true, setRequestHeader = ('सामग्री-प्रकार', 'एप्लिकेशन / x-www-form-urlencoded')

जब समस्या होती है, तो आमतौर पर केवल एक AJAX कॉल चल रहा है। इसलिए यह AJAX कॉल को ओवरलैप करने के कारण नहीं है। कभी-कभी समस्या तब होती है जब डिवाइस व्यस्त होता है, लेकिन कभी-कभी नहीं, और DevTools के बिना हमें वास्तव में नहीं पता कि उस समय क्या हो रहा है।

iOS 13 ऐसा नहीं करता है, न ही क्रोम या फ़ायरफ़ॉक्स। हमारे पास iOS 11 या 12. चलाने वाले कोई भी परीक्षण उपकरण नहीं हैं?

मैं इसे यहाँ देख रहा हूँ क्योंकि यह प्रश्न इस समस्या को खोजते समय Google के शीर्ष परिणाम है।


-1

यह IIS में हेडर जोड़ने के बाद ही ASP.NET के साथ काम करता है । पर्याप्त नहीं था।pragma:no-cacheCache-Control: no-cache


-2

मैं फ़ंक्शन हस्ताक्षर को इस तरह से संशोधित करने के लिए वर्कअराउंड का सुझाव देता हूं:

getNewRecordID (intRecordType, strTimestamp) और फिर हमेशा टाइमस्टैम्प पैरामीटर में भी पास करें, और सर्वर साइड पर उस मान को छोड़ दें। इस मुद्दे के आसपास काम करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.