2012-10-25 16 views
9

मैं जीडब्ल्यूटी का उपयोग करके एक वेब ऐप विकसित कर रहा हूं और ब्राउज़र में app.nocache.js फ़ाइल के कैशिंग के साथ पागल समस्या देख रहा हूं, भले ही वेब सर्वर ने फ़ाइल की एक नई प्रतिलिपि भेजी हो!ब्राउजर स्टॉप कैशिंग को कैसे रोकें GWT nocache.js

मैं ऐप संकलित करने के लिए ग्रहण का उपयोग कर रहा हूं, जो देव मोड में काम करता है। उत्पादन मोड का परीक्षण करने के लिए, मेरे पास एक वर्चुअल मशीन (ओरेकल वर्चुअलबॉक्स) है जो मेरे होस्ट मशीन (विंडोज 7) पर चल रहे उबंटू अतिथि ओएस के साथ है। मैं वीएम में lighttpd वेब सर्वर चला रहा हूँ। वीएम मेरी परियोजना की युद्ध निर्देशिका साझा कर रहा है, और वेब सर्वर इस डीआईआर की सेवा कर रहा है।

मैं क्रोम ब्राउज़र के रूप में उपयोग कर रहा हूं, लेकिन फ़ायरफ़ॉक्स में भी यही बात होती है।

  • अनुप्रयोग के लिए वेब पेज खाली है:

    यहाँ परिदृश्य है। क्रोम के "निरीक्षण तत्व" उपकरण से पूछें, ऐसा इसलिए है क्योंकि यह 6E89D5C912DD8F3F806083C8AA626B83.cache.html लाने की कोशिश कर रहा है, जो मौजूद नहीं है (404 not found)।

  • मैं युद्ध निर्देशिका की जांच करता हूं, और निश्चित रूप से पर्याप्त है, वह फ़ाइल मौजूद नहीं है।
  • ब्राउज़र पर app.nocache.jsवेब सर्वर (200 ओके) से को रेट किया गया था, क्योंकि सर्वर पर फ़ाइल ब्राउज़र कैश से नई थी। मैंने सत्यापित किया कि सर्वर द्वारा लौटाई गई नई फ़ाइल के लिए फ़ाइल आकार और टाइमस्टैम्प सही थे। (यह जानकारी सर्वर की HTTP प्रतिक्रिया के बारे में क्रोम रिपोर्ट है)
  • हालांकि, यदि मैं ब्राउज़र पर app.nocache.js खोलता हूं, तो जावास्क्रिप्ट 6E89D5C912DD8F3F806083C8AA626B83.cache.html का जिक्र कर रहा है !!! ऐसा है, भले ही वेब सर्वर ने एक नया app.nocache.js भेजा, ब्राउज़र ने इसे अनदेखा कर दिया है और इसकी कैश की गई प्रति का उपयोग करना जारी रखा है!

  • गोटो Google-> ग्रहण में जीडब्ल्यूटी संकलन। पूरी चीज को दोबारा दोहराएं।

  • युद्ध निर्देशिका में सत्यापित करें कि app.nocache.js ओवरराइट किया गया था और इसमें एक नया टाइमस्टैम्प है।
  • क्रोम से पृष्ठ को फिर से लोड करें और एक बार फिर सत्यापित करें कि सर्वर ने app.nocache.js पर 200 ओके प्रतिक्रिया भेजी है।
  • ब्राउज़र एक बार फिर 6E89D5C912DD8F3F806083C8AA626B83.cache.html लोड करने का प्रयास करता है और विफल रहता है। ब्राउज़र अभी भी app.nocache.js की पुरानी कैश की गई प्रति का उपयोग कर रहा है।
  • युद्ध निर्देशिका में बात को पूरी तरह बनाया गया है कि कुछ भी नहीं 6E89D5C912DD8F3F806083C8AA626B83.cache.html लिए बात कर रहा है

गलत क्या जा रहा है (खोजें और ग्रेप के माध्यम से)? ब्राउजर यह nocache.js फ़ाइल कैशिंग क्यों कर रहा है, भले ही सर्वर इसे एक नई प्रति भेज रहा हो?


ब्राउज़र में पुनः लोड करने पर क्लिक करते समय HTTP अनुरोध/प्रतिक्रिया शीर्षलेख की एक प्रति यहां दी गई है। इस का पता लगाने में, सर्वर सामग्री पिछले प्राप्त के बाद से कंपाइल नहीं किया गया है (लेकिन ध्यान दें nocache.js का संचित संस्करण अभी भी गलत है!):

Request URL:http://192.168.2.4/xbts_ui/xbts_ui.nocache.js 
Request Method:GET 
Status Code:304 Not Modified 
Request Headersview source 
Accept:*/* 
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3 
Accept-Encoding:gzip,deflate,sdch 
Accept-Language:en-US,en;q=0.8 
Cache-Control:max-age=0 
Connection:keep-alive 
Host:192.168.2.4 
If-Modified-Since:Thu, 25 Oct 2012 17:55:26 GMT 
If-None-Match:"2881105249" 
Referer:http://192.168.2.4/XBTS_ui.html 
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4 
Response Headersview source 
Accept-Ranges:bytes 
Content-Type:text/javascript 
Date:Thu, 25 Oct 2012 20:27:55 GMT 
ETag:"2881105249" 
Last-Modified:Thu, 25 Oct 2012 17:55:26 GMT 
Server:lighttpd/1.4.31 
+0

बीटीडब्लू, यह http://stackoverflow.com/questions/3407649/stop-browser-scripts-caching-in-gwt-app जैसा लगता है लेकिन इसमें कोई ऐसी जानकारी नहीं थी जिसने मुझे इस समस्या को हल करने में मदद की। – jfritz42

+0

क्या आपने https://developers.google.com/web-toolkit/doc/latest/DevGuideCompilingAndDebugging#perfect_caching पढ़ा था? –

+0

हां, और ऐसा लगता है कि सही चीज हो रही है, क्योंकि वह पृष्ठ कहता है "एक अगर संशोधित-चूंकि fetch पर्याप्त है"। मैं क्रोम इंस्पेक्ट एलिमेंट टूल से बता सकता हूं कि ब्राउजर ने "अगर-संशोधित-चूंकि: थू, 25 अक्टूबर 2012 17:03:53 जीएमटी" जीईटी अनुरोध में भेजा, और सर्वर ने "अंतिम संशोधित: थू, 25" अक्टूबर 2012 17:55:26 जीएमटी " – jfritz42

उत्तर

5

ब्राउज़र कैशिंग से बचने का सबसे अच्छा तरीका अब समाप्ति समय निर्धारित करना है और अधिकतम आयु = 0 और अनिवार्य नियंत्रण को जोड़ना है।

यह विन्यास मैं अपाचे-httpd के साथ उपयोग

ExpiresActive on 
<LocationMatch "nocache"> 
    ExpiresDefault "now" 
    Header set Cache-Control "public, max-age=0, must-revalidate" 
</LocationMatch> 
<LocationMatch "\.cache\."> 
    ExpiresDefault "now plus 1 year" 
</LocationMatch> 

lighthttpd के लिए आपके विन्यास

server.modules = (
    "mod_expire", 
    "mod_setenv", 
) 
... 
$HTTP["url"] =~ "\.nocache\." { 
    setenv.add-response-header = ("Cache-Control" => "public, max-age=0, must-revalidate") 
    expire.url = ("" => "access plus 0 days") 
} 

$HTTP["url"] =~ "\.cache\." { 
    expire.url = ("" => "access plus 1 years") 
} 
+0

धन्यवाद। मैंने lighttpd कॉन्फ़िगरेशन में कुछ टाइपो तय किए हैं। Apache config को lighttpd में अनुवाद करने के लिए धन्यवाद। – jfritz42

2
  • app.nocache.js ब्राउज़र पर वेब सर्वर (200 ओके) से रिलायड किया गया था, क्योंकि सर्वर पर फ़ाइल ब्राउज़र कैश से नई थी। मैंने सत्यापित किया कि सर्वर द्वारा लौटाई गई नई फ़ाइल के लिए फ़ाइल आकार और टाइमस्टैम्प सही थे।(यह जानकारी Chrome सर्वर की HTTP प्रतिक्रिया के बारे में रिपोर्ट कर रहा है)

मैं इस पर भरोसा नहीं होता। मैंने क्रोम के देव उपकरणों में कैचिंग के साथ संयोजन में नेटवर्क टैब के साथ थोड़ा अजीब व्यवहार देखा है (कम से कम, यह मेरे लिए 100% पारदर्शी नहीं है)। संदेह के मामले में, मैं आमतौर पर फायरबग से परामर्श करता हूं।

तो शायद क्रोम अभी भी पुराने संस्करण का उपयोग करता है। हो सकता है कि यह बहुत समय पहले तय हो सकता है कि उसे फिर से संसाधन को फिर से लोड नहीं करना पड़ेगा। कैश साफ़ करने से इसे हल करना चाहिए। और फिर पेज को पुनः लोड करने से पहले सही कैशिंग हेडर सेट करना सुनिश्चित करें, उदाहरण के लिए देखें Ideal HTTP cache control headers for different types of resources

3

दो सरल समाधान (हालांकि पहले एक की दूसरी संशोधित किया गया है संस्करण) कर रहे हैं

होना चाहिए

1) अपनी * .html फ़ाइल का नाम बदलें जिसमें * .nocache.js का संदर्भ है यानी MyProject.html MyProject.jsp पर खोजें आप के स्थान * MyProject.html

में स्क्रिप्ट .nocache.js
<script language="javascript" src="MyProject/MyProject.nocache.js"></script> 

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

है
<script language="javascript" src="MyProject/MyProject.nocache.jsp?dummyParam=<%= "" + new java.util.Date().getTime() %>"></script> 

स्पष्टीकरण: dummyParam किसी काम का नहीं किया जाएगा, लेकिन हमें हमारे इच्छित परिणाम यानी हमें के बजाय 304

नोट 200 कोड प्राप्त होगा मिल जाएगा: आप इस तकनीक का प्रयोग करेंगे तो आप की आवश्यकता होगी यह सुनिश्चित करने के लिए कि आप अपने आवेदन को लोड करने के लिए सही जेएसपी फ़ाइल को इंगित कर रहे हैं (इस बदलाव से पहले आप HTML फ़ाइल का उपयोग करके अपना ऐप लोड कर रहे थे)।

2) यदि आप जेएसपी समाधान का उपयोग नहीं करना चाहते हैं और अपनी एचटीएमएल फाइल के साथ रहना चाहते हैं तो आपको जावा स्क्रिप्ट को नाकाची फ़ाइल लोड करते समय क्लाइंट साइड पर गतिशील रूप से अद्वितीय पैरामीटर मान जोड़ने की आवश्यकता होगी। मुझे लगता है कि उपर्युक्त समाधान देने के लिए अब एक बड़ा सौदा नहीं होना चाहिए।

मैंने पहली तकनीक सफलतापूर्वक उपयोग की है, उम्मीद है कि इससे मदद मिलेगी।

-1

अपाचे के माध्यम से कैशिंग को असफल रूप से रोकने के बाद मैंने एक बैश स्क्रिप्ट बनाई जो रूट मेरे लिनक्स टॉमकैट सर्वर पर क्रॉन जॉब में हर मिनट चलता है।

#!/bin/bash 
# 
# Touches GWT nocache.js files in the Tomcat web app directory to prevent caching. 
# Execute this script every minute in a root cron job. 
# 
cd /var/lib/tomcat7/webapps 
find . -name '*nocache.js' | while read file; do 
    logger "Touching file '$file'" 
    touch "$file" 
done 
+0

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

5

हमारे पास एक समान समस्या थी। हमने पाया कि nocache.js का टाइमस्टैम्प gwt संकलन के साथ अद्यतन नहीं किया गया था इसलिए निर्माण पर फ़ाइल को छूना था। और फिर हमने @Manolo Carrasco Moñino से भी फ़िक्स को लागू किया। मैंने इस मुद्दे के बारे में एक ब्लॉग लिखा था। http://programtalk.com/java/gwt-nocachejs-cached-by-browser/

हम जीडब्ल्यूटी के संस्करण 2.7 का उपयोग कर रहे हैं क्योंकि टिप्पणी भी बताती है।

+1

टाइमस्टैम्प नहीं बदल रहा था हमारी समस्या थी। मेरा मानना ​​है कि यह जीडब्ल्यूटी 2.7 में केवल एक बग है। ब्लॉग पर की गई पोस्ट के लिए धन्यवाद! – Craigo

+0

ग्रेट उत्तर। अब मैंने सीखा + शिफ्ट + एफ 5 पहली बार एक अस्थायी समाधान है। – Tom

0

कैश समस्या से छुटकारा पाने और स्वयं को अनवरोधित करने के लिए केवल कॉग्निटो मोड में पृष्ठ खोलें।

आपको अन्य टिप्पणियों में उल्लिखित कैश समय को कॉन्फ़िगर करने की आवश्यकता है।

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