2009-08-25 12 views
18

मेरे पास एक ऐप्पल है जो URLConnection का उपयोग कर http कनेक्शन पर छवियों को लोड कर रहा है। मैं सभी कनेक्शन के लिए setUseCaches (सत्य) सेट कर रहा हूं, लेकिन अभी भी कोई कैशिंग व्यवहार नहीं देख रहा हूं। मेरी छवि के HTTP शीर्षलेखों में उचित कैश सेटिंग्स हैं।URLConnection.setUseCaches() अभ्यास में कैसे काम करता है?

Java प्लग-इन के वर्तमान संस्करण (1.3.1) केवल फ़ाइलें हैं जिनके नाम .jar या .class में खत्म हो उसके ब्राउज़र कैश की जाँच करता है: आप bug 4528599 को देखें, तो यह नहीं बल्कि रहस्यमय बयान नहीं है। मुझे बताया गया है कि जावा प्लग-इन 1.4 के लिए ब्राउज़र कैश को निम्न फ़ाइल प्रकारों के लिए चेक किया जाएगा: .class, .jar, .zip, .jpg, .gif, .wav, .au।

बेशक, इसे 1.6 के लिए तय किया गया था, लेकिन 1.6 के तहत भी मुझे कोई कैशिंग दिखाई नहीं दे रहा है। मेरी छवियां पीएनजी फाइलें हैं, और कुछ मामलों में वास्तव में एक .png एक्सटेंशन के साथ समाप्त नहीं होती है। मुझे कोई कैशिंग नहीं दिख रही है।

बग फिक्स रिपोर्ट 1.6 एकीकृत डाउनलोड इंजन के बारे में बात करती है, लेकिन Google इसके बारे में बहुत कुछ नहीं जानता है।

क्या यह काम करना चाहिए या यह सिर्फ एक और टूटा हुआ सूर्य "फीचर" है। क्या कोई तरीका या कामकाज है जहां मैं ब्राउज़र कैश से पीएनजी छवियों को लोड करने के लिए अपना एप्लेट प्राप्त कर सकता हूं? मैं अपना खुद का कार्यान्वयन नहीं करना चाहूंगा ....

अद्यतन: कैशिंग ResponseCache कार्यान्वयन से जुड़ा हुआ प्रतीत होता है। यह कैसे काम करता है इस बारे में अधिक जानकारी के लिए this technote देखें। अंतिम पंक्ति कहती है:

जावा 2 मानक संस्करण में URLConnection कैशिंग का कोई डिफ़ॉल्ट कार्यान्वयन नहीं है। हालांकि, जावा प्लगइन और जावा वेबस्टार्ट बॉक्स में से एक प्रदान करते हैं।

तो ऐसा लगता है कि सवाल वास्तव में बनता है: जावा प्लगइन प्रतिक्रिया कैश कार्यान्वयन वास्तव में कैसे काम करता है? V1.4/v1.5/v.16

के बीच अंतर क्या हैं कोई भी कोई विचार है?

उत्तर

7

यह विधि कैशिंग को अनुमति देने वाले मानों के आउटगोइंग अनुरोध में केवल HTTP कैश-कंट्रोल हेडर निर्देश सेट करता है। अगर आपने setUseCaches (false) कहा था, तो

Cache-Control: no-cache 

उदाहरण के लिए निर्देश होगा। इसे जांचने के लिए, आप अपने एप्लेट और सर्वर के बीच एक HTTP डीबगिंग प्रॉक्सी सर्वर डाल सकते हैं और हेडर पर एक नज़र डालें।

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

कुछ अन्य बातों की जांच करने के लिए:

  • https प्रतिक्रियाओं कभी नहीं कैश्ड कर रहे हैं;
  • आपके पास क्लाइंट और सर्वर के बीच HTTP कैश नहीं हो सकता है;
  • एकमात्र HTTP कैश ब्राउज़र का कैश है लेकिन इसे अक्षम किया जा सकता है या बहुत कम डिस्क का उपयोग करने के लिए सेट किया जा सकता है।

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

4

अमूर्त वर्ग URLConnection सेट/getUseCaches विधियों को प्रदान करता है, जो किसी उप-वर्ग द्वारा उपयोग किया जा सकता है। जहां तक ​​मैं कभी भी निर्धारित करने में सक्षम हूं, हालांकि, HttpURLConnection क्लास उन क्षेत्रों का किसी भी तरह से उपयोग नहीं करता है। मूल्य को सही या गलत पर सेट करने से कोई अलग व्यवहार नहीं होगा। , या If-Modified-Since और If-None-Match हेडर का उपयोग कोशिश करते हैं और एक स्थिति कोड 304 के लिए देखो (नहीं है;

आप http cacheing व्यवहार जोड़ना चाहते हैं, तो आप या तो यह अपने आप (या सॉकेट अपनी खुद लिखते हैं, या HttpURLConnector विस्तार) कर सकते हैं संशोधित)। दूसरा विकल्प शायद सबसे आसान है और आपको सबसे अच्छा परिणाम मिल जाएगा।

+0

कैश लगातार होने पर स्वयं को लिखना गैर-तुच्छ है। आपको इसे एक साथ चलने वाले एकाधिक JVMs तक पहुंच योग्य बनाने की आवश्यकता है और आपको इसे आकार में सीमित करने की आवश्यकता है। यह वास्तव में काम करना चाहिए .... arrgh ... –

+0

मैं निश्चित रूप से अपने स्वयं के कैश को घुमाने की सलाह नहीं दूंगा। यदि ग्राहक और सर्वर सही HTTP शीर्षलेख भेज रहे हैं लेकिन क्लाइंट और सर्वर के बीच कोई इंटरमीडिएट HTTP कैश स्थापित नहीं है, तो वर्नीश, पाउंड या स्क्विड जैसे प्रॉक्सी कैश इंस्टॉल करें। –

संबंधित मुद्दे