2010-04-01 14 views
8

मैं सभी image/* और text/css के लिए Expires शीर्षलेख सेट करना चाहता हूं। मैं इसे Filter में कर रहा हूं। हालांकि:सामग्री-प्रकार के आधार पर प्रतिक्रिया शीर्षलेख कैसे जोड़ें; प्रतिक्रिया देने से पहले सामग्री-प्रकार प्राप्त करना

  • बुला सामग्री प्रकार अभी तक नहीं "का एहसास" है
  • बुला सामग्री प्रकार सेट होने के बाद, लेकिन इतना सामग्री-लंबाई, जो नए शीर्षलेख जोड़कर, (कम से कम में मनाही है से पहले बिलाव कार्यान्वयन)

मैं अनुरोध किया गया संसाधन के एक्सटेंशन का उपयोग कर सकते हैं, लेकिन जब से सीएसएस फ़ाइलों में से कुछ उन्हें जार-फ़ाइलों के अंदर से लेकर richfaces द्वारा उत्पन्न कर रहे, फ़ाइल का नाम, x.css नहीं है, लेकिन /xx/yy/zz.xcss/DATB/... है।

तो, क्या प्रतिक्रिया देने से पहले सामग्री-प्रकार प्राप्त करने का कोई तरीका है।

उत्तर

13

हां, HttpServletResponseWrapper लागू करें और setContentType() ओवरराइड करें। इस प्रकार

class AddExpiresHeader extends HttpServletResponseWrapper { 
    private static final long ONE_WEEK_IN_MILLIS = 604800000L; 

    public AddExpiresHeader(HttpServletResponse response) { 
     super(response); 
    } 

    public void setContentType(String type) { 
     if (type.startsWith("text") || type.startsWith("image")) { 
      super.setDateHeader("Expires", System.currentTimeMillis() + ONE_WEEK_IN_MILLIS); 
     } 
     super.setContentType(type); 
    } 
} 

और इसका इस्तेमाल करते हैं:

chain.doFilter(request, new AddExpiresHeader((HttpServletResponse) response)); 
+0

बेशक .. मुझे इसके बारे में सोचना चाहिए .. खासकर जब एक ही फ़िल्टर में एक और रैपर का उपयोग करना (किसी अन्य कारण से) .. :) – Bozho

+0

(केवल, यह 0 नहीं होगा, लेकिन भविष्य में एक समय होगा) – Bozho

+0

हां, ज़ाहिर है। या आप जोडाटाइम का उपयोग करते हैं? ;) – BalusC

2

आप HttpServletResponseWrapper उपवर्ग और addHeader और setHeader नव वांछित हैडर जब "सामग्री प्रकार" शीर्षक नाम के रूप में में पारित हो जाता है जोड़ने के लिए ओवरराइड करना चाहिए। सुनिश्चित करें कि उन ओवरराइड विधियों में भी सुपर कॉल करना न भूलें। इस नए रैपर के साथ डूफिल्टर विधि तर्क में भेजे गए प्रतिक्रिया को लपेटें और कॉल करने के लिए रैपर को रैपर पास करें।

+0

(+1) तुम्हारा और BalusC के जवाब दोनों सही समाधान कर रहे हैं, लेकिन उनके एक सा क्लीनर (कम से कम मेरे लिए है, क्योंकि एक नहीं तो है- सामान्य विधि ओवरराइड है) – Bozho

+0

हां मैंने setContentType विधि को याद किया। आप setHeader और addHeader के लिए ऐसा करने पर विचार करना चाहेंगे क्योंकि आप कभी नहीं जानते कि इसे कैसे कोड किया जा सकता है। बेशक आप सभी कोड के मालिक हैं। – laz

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