2015-10-19 5 views
13

मैं स्थिर संसाधनों के लिए स्प्रिंग बूट में Cache-Control HTTP शीर्षलेख कैसे जोड़ सकता हूं?स्प्रिंग बूट में स्थिर संसाधन के लिए कैश-कंट्रोल हेडर कैसे जोड़ें?

आवेदन है, जो सही ढंग से हेडर लिखते हैं में एक फिल्टर घटक का उपयोग कर कोशिश की, लेकिन Cache-Control हैडर ओवरराइट हो जाता है।

@Component 
public class CacheBustingFilter implements Filter { 

    @Override 
    public void init(FilterConfig filterConfig) throws ServletException { 
    } 

    @Override 
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) 
               throws IOException, ServletException { 

     HttpServletResponse httpResp = (HttpServletResponse) resp; 
     httpResp.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); 
     httpResp.setHeader("This-Header-Is-Set", "no-cache, no-store, must-revalidate"); 
     httpResp.setHeader("Expires", "0"); 

     chain.doFilter(req, resp); 
    } 

मैं ब्राउज़र में क्या मिलता है:

Cache-Control:no-store 
This-Header-Is-Set:no-cache, no-store, must-revalidate 
Expires:0 

क्या मैं चाहते हैं:

Cache-Control:no-cache, no-store, must-revalidate 
This-Header-Is-Set:no-cache, no-store, must-revalidate 
Expires:0 
+0

http://stackoverflow.com/questions/24164014/how- टू-सक्षम-एचटीएमएल-प्रतिक्रिया-कैशिंग-इन-वसंत-बूट –

+0

कोशिश की कि यह भी काम नहीं किया। यह एक्स-हेडर और विभिन्न सामान जोड़ता है। लेकिन कैश-कंट्रोल हमेशा "नो-स्टोर" होता है। – MatteKarla

उत्तर

9

documentation अनुसार ResourceHandlerRegistry की,। यह बहुत आसान है। (मेरे पास अभी से कोई कोड संबंधित नहीं है।)

उस स्थान पर जहां आप अपने स्थिर संसाधनों को कॉन्फ़िगर करते हैं, बस addResourceHandler विधि जोड़ें, यह ResourceHandlerRegistration ऑब्जेक्ट वापस कर देगा।

वहाँ आप setCacheControl विधि का उपयोग कर सकते हैं। आपको क्या करना है CacheControl ओबेजेक्ट को कॉन्फ़िगर और सेट करना है।

यह वसंत 4.2 के बाद से है, अन्यथा आपको इसे नीचे की तरह करना होगा।

@Configuration 
@EnableWebMvc 
@ComponentScan("my.packages.here") 
public class WebConfig extends WebMvcConfigurerAdapter { 


    @Override 
    public void addResourceHandlers(ResourceHandlerRegistry registry) { 
     registry.addResourceHandler("/resources/**").setCachePeriod(0); 
    } 

} 
+1

Setti setCacheControl() के साथ ng कैशकंट्रोल ऑब्जेक्ट सर्वर को सही हेडर भेजता है, जिसे 'curl -I' – MatteKarla

+0

के साथ सत्यापित किया गया है, मुझे कैशकंट्रोल ऑब्जेक्ट और सेट कैशकंट्रोल का कोई कोड नमूना नहीं मिला, क्या आप कृपया यह साझा कर सकते हैं कि आपने यह कैसे किया? धन्यवाद! –

+0

दरअसल, आपको @EnableWebMvc का उपयोग नहीं करना चाहिए। इससे मुझे पता चल गया कि क्या होता है, क्योंकि कुछ पेजों परोसा नहीं जाता था। Http://stackoverflow.com/a/27383522/4252764 –

11

यह वसंत सुरक्षा के कारण होता है: यह सभी कैश हेडर को पूरी तरह से कैशिंग अक्षम करने के लिए फिर से लिखता है।

  1. स्थिर संसाधनों के लिए वसंत सुरक्षा अक्षम
  2. स्प्रिंग बूट के वर्तमान संस्करण में स्थिर संसाधन कैश प्रोसेसिंग

सक्षम करें हम application.properties में इस व्यवहार को बदल सकते हैं: तो हम दो काम करने की जरूरत है config।

कुछ संसाधनों के लिए वसंत सुरक्षा अक्षम:

# Comma-separated list of paths to exclude from the default secured 
security.ignored=/myAssets/** 

स्थिर संसाधनों के लिए कैश शीर्षलेख भेजने सक्षम करें:

# Enable HTML5 application cache manifest rewriting. 
spring.resources.chain.html-application-cache=true 

# Enable the Spring Resource Handling chain. Disabled by default unless at least one strategy has been enabled. 
spring.resources.chain.enabled=true 
# Enable the content Version Strategy. 
spring.resources.chain.strategy.content.enabled=true 
# Comma-separated list of patterns to apply to the Version Strategy. 
spring.resources.chain.strategy.content.paths=/** 

# Locations of static resources. 
spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/ 

सब है कि। अब स्प्रिंग जांच करेगी कि आपकी स्थिर फाइलें बदली गई हैं और स्मार्ट प्रतिक्रियाएं (अगर-संशोधित-चूंकि और अन्य) भेज सकती हैं और आपके एपकेच को फिर से लिख सकती हैं।

इसके अलावा, अगर वहाँ कारणों कुछ संसाधनों के लिए सामग्री आधारित संस्करण का उपयोग नहीं करने के लिए कर रहे हैं - आप वैकल्पिक FixedVersion रणनीति और सेट संस्करण स्पष्ट रूप से अपने config में उपयोग कर सकते हैं:

#Enable the fixed Version Strategy. 
spring.resources.chain.strategy.fixed.enabled=false 
# Comma-separated list of patterns to apply to the Version Strategy. 
spring.resources.chain.strategy.fixed.paths= 
# Version string to use for the Version Strategy. 
spring.resources.chain.strategy.fixed.version= 

See more in docs

1

Maleenc की, इस सवाल का जवाब सही है। हालांकि, इस कार्यान्वयन के साथ एक मुद्दा है।

निम्न कोड पहले अनुरोध पर सही कैश-कंट्रोल हेडर प्रदान करेगा, लेकिन भविष्य में अनुरोध जो 304 (संशोधित नहीं) लौटाता है, वसंत सुरक्षा द्वारा निर्धारित डिफ़ॉल्ट कैश-कंट्रोल हेडर वापस करेगा। {कोड}

public void addResourceHandlers(ResourceHandlerRegistry registry) {   
    registry.addResourceHandler("/resources/**").setCacheControl(CacheControl.maxAge(10, TimeUnit.SECONDS)); 
} 

मैं वसंत टीम के लिए इस मुद्दे को उठाया है, https://jira.spring.io/browse/SPR-15133 देखते हैं। यहां प्रतिक्रिया थी: "अब आपको अपने पूरे एप्लिकेशन के लिए सुरक्षा कैश-कंट्रोल हेडर को अक्षम नहीं करना चाहिए; उस मुद्दे पर एक विशिष्ट पथ (संसाधन हैंडलिंग, यहां) को अक्षम करने का उचित तरीका उस समस्या टिप्पणी में समझाया गया है, "Workaround" section."

देखें
0

वसंत बूट 1.3.3 का उपयोग करना, मैं maleenc जवाब का उपयोग कर एक 404 जवाब था मैं एक संसाधन स्थान जोड़कर इसे सही कर सकते हैं:।

@Configuration 
public class HttpClientConfiguration extends WebMvcConfigurerAdapter { 
    @Override 
    public void addResourceHandlers(ResourceHandlerRegistry registry) { 
     registry.addResourceHandler("/**").setCacheControl(CacheControl.maxAge(1, TimeUnit.DAYS)) 
       .addResourceLocations("/"); 
    } 
} 
संबंधित मुद्दे