2012-01-23 13 views
8

सेटिंग से बचने के लिए स्प्रिंग को कॉन्फ़िगर कैसे करें मेरी प्रणाली स्प्रिंग एमवीसी आधारित है और मैंने जांच की है कि वसंत स्वचालित रूप से PRAGMA सेट करता है: नो-कैश। सिस्टम एसएसएल के माध्यम से उपयोगकर्ताओं के लिए उपलब्ध है। जब उपयोगकर्ता इंटरनेट एक्सप्लोरर 7 या 8 का उपयोग करके कुछ डाउनलोड करने का प्रयास करते हैं तो जैसे त्रुटि "इंटरनेट एक्सप्लोरर सर्वर से फ़ाइल डाउनलोड नहीं कर सकता" प्रकट होता है (अधिक जानकारी: http://support.microsoft.com/default.aspx?scid=KB;EN-US;q316431&)।प्रगति नो-कैश

मैं कोड bellow तरह WebContentInterceptor कॉन्फ़िगर करने के लिए कोशिश की, लेकिन काम नहीं करता:

<mvc:interceptors> 
    <bean id="webContentInterceptor" class="org.springframework.web.servlet.mvc.WebContentInterceptor"> 
     <property name="cacheSeconds" value="2100" /> 
     <property name="useExpiresHeader" value="false" /> 
     <property name="useCacheControlHeader" value="false" /> 
     <property name="useCacheControlNoStore" value="false" /> 
    </bean> 
</mvc:interceptors> 

क्या मैं से बचने कर सकते हैं स्प्रिंग Pragma भेजें: नहीं-कैश और कैश नियंत्रण से संबंधित?

सम्मान!

+0

क्या आपने देखा कि जिस लेख से आपने लिंक किया है, केवल आईई 5 और आईई 6 के लिए लागू होता है? – Ralph

+0

नहीं, यह आईई 9 को छोड़कर सभी आईई के लिए लागू होता है। –

उत्तर

7

में और हेडर मान को प्रतिक्रिया ऑब्जेक्ट पर सेट करें। इंटरसेप्टर कुछ भी नहीं कर रहे हैं, लेकिन अभी फिल्टर ओवरराइड और क्रमशः अनुरोध और प्रतिक्रिया हेडर स्थापित करने के लिए

prehandle और posthandle फ़िल्टर का उपयोग।

मुझे बताएं कि क्या आप इसे विशिष्ट उदाहरण करना चाहते हैं।

<mvc:interceptors> 
    <mvc:interceptor> 
     <mvc:mapping path="/**" /> 
     <beans:bean id="customInterceptor" 
      class="org.example.interceptors.CustomInterceptor"> 
     </beans:bean> 
    </mvc:interceptor> 

</mvc:interceptors> 




public class CustomInterceptor implements HandlerInterceptor{ 

    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object arg2, ModelAndView modelAndView) throws Exception { 
    response.setHeader(...);} 
} 
+1

हाय अभिी! समस्या यह है कि WebContentGenerator क्लास HTTP मानकों को विशेषता मान cacheSeconds (if -1, कोई हेडर नहीं, अन्यथा यह हेडर सेट करता है) के अनुसार बनाता है। और, सेट होने के बाद, उन्हें प्रतिक्रिया से हटाना संभव नहीं है ... –

+0

इसके बजाय हैंडलरइंटरसेप्टर का उपयोग करें और पोस्टहेडल में प्रतिक्रिया सेट करें। – Abhi

+0

हाय @ एबी! मैंने जो किया वह मैंने किया और मैंने प्रीहैंडल विधि में समाधान लागू किया और यह काम करता है! यह एक अच्छा और स्पष्ट समाधान नहीं है लेकिन फिर भी मेरी समस्या का समाधान करें। PostHandle विधि हल नहीं होती है क्योंकि HTTP शीर्षलेख पहले ही बनाए जाते हैं जब इसे निष्पादित किया जाता है। –

2

कैश सेकंड को नकारात्मक मान पर सेट करने का प्रयास करें।


यदि यह मदद नहीं करता है आप को ओवरराइड करने की आवश्यकता होगी: आप अपने स्वयं के कस्टम इंटरसेप्टर लिख सकते हैं

protected final void preventCaching(HttpServletResponse response) 

या

protected final void applyCacheSeconds(HttpServletResponse response, int seconds, boolean mustRevalidate) 

दोनों ही तरीकों से लागू कर रहे हैं WebContentGenerator

+0

हाय राल्फ! मुझे नहीं पता कि क्या होता है लेकिन जब वसंत शुरू होता है, तो कैश सेकेंड वेबकंटेंट जेनरेटर की विशेषता सेट -1 (डिफ़ॉल्ट रूप से) होती है, लेकिन जब लागू कैशसेकंड को कैश कहा जाता है तो सेकेंड 0 है, रोकथाम को कॉल करना। और सेटटर विधि सेट कैशसेकंड को केवल एक बार बुलाया जाता है ... –

+0

@ मार्सेलो जुवेंटिनो: एक तरीका यह है कि मैं इस व्यवहार को कैसे समझा सकता हूं कि आप "अभी भी" टॉमसज़ जैसे 'एन्नोटैटोपॉन मेथिंग हैंल्डर' का उपयोग अपने (हटाए गए) उत्तर में सुझाए गए हैं, लेकिन ' WebContentInterceptor' जैसे आपने अपने प्रश्न में लिखा था। – Ralph

+0

हाय @ राल्फ! मैंने दोनों समाधानों की कोशिश की और वे हल नहीं हुए। भाई, @ एबी ने एक हैंडलरइंटरसेप्टर का उपयोग करने और प्रीहैंडलर विधि में समाधान को हल करने का सुझाव दिया। लेकिन यह एक स्पष्ट और अच्छा समाधान नहीं है। –

1
<mvc:interceptors> 
    <bean id="webContentInterceptor" class="org.springframework.web.servlet.mvc.WebContentInterceptor"> 
     <property name="cacheSeconds" value="2100" /> 
     <property name="useExpiresHeader" value="false" /> 
     <property name="useCacheControlHeader" value="false" /> 
     <property name="useCacheControlNoStore" value="false" /> 
     <property name="cacheMappings"> 
      <props> 
       <prop key="/**/**">-1</prop><!-- removes pragma no-cache --> 
      </props> 
     </property> 
    </bean> 
</mvc:interceptors> 
2

सरल दृष्टिकोण शायद सिर्फ एक सर्वलेट फिल्टर के साथ लिखा जा रहा से शीर्ष लेख को रोकने के लिए है। इस तरह कोई वसंत विन्यास संशोधित नहीं किया जाना चाहिए और आप मुफ्त में सही कैश कार्यक्षमता उठाते हैं।

public class PragmaFilter implements Filter { 

    private static String PRAGMA_HEADER = "Pragma"; 

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

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
     chain.doFilter(request, new NoPragmaHttpServletResponseWrapper(response)); 
    } 

    @Override 
    public void destroy() { } 

    private final class NoPragmaHttpServletResponseWrapper extends HttpServletResponseWrapper { 

     private NoPragmaHttpServletResponseWrapper(ServletResponse response) { 
      super((HttpServletResponse) response); 
     } 

     @Override 
     public void addHeader(String name, String value) { 
      if (PRAGMA_HEADER.equals(name)) { 
       return; 
      } 
      super.addHeader(name, value); 
     } 

     @Override 
     public void setHeader(String name, String value) { 
      if (PRAGMA_HEADER.equals(name)) { 
       return; 
      } 
      super.setHeader(name, value); 
     } 
    } 

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