2010-08-17 8 views
17

ऐसा प्रतीत नहीं होता है कि HttpServletResponse ऐसा करने के लिए किसी भी तरीके का खुलासा करता है।क्या जावा में प्रतिक्रिया ऑब्जेक्ट से कुकीज़ पढ़ने का कोई तरीका है?

अभी, मैं यह पता लगाने के प्रयास में एक क्रूर और बीमार समझने वाली सर्वलेट में लॉगिंग कोड का एक गुच्छा जोड़ रहा हूं। मुझे पता है कि यह कुकीज़ का एक गुच्छा सेट करता है, लेकिन मुझे नहीं पता कि कब, क्यों, या क्या। सर्वलेट के निष्पादन के अंत में HttpServletResponse ऑब्जेक्ट में सभी कुकीज़ को लॉग करना अच्छा लगेगा।

मुझे पता है कि कुकीज़ आमतौर पर ब्राउज़र की ज़िम्मेदारी होती है, और मुझे याद है कि .NET में ऐसा करने का कोई तरीका नहीं था। बस उम्मीद है कि जावा अलग हो सकता है ...

लेकिन यदि यह संभव नहीं है - मैं जो करने की कोशिश कर रहा हूं उसे पूरा करने के लिए कोई अन्य विचार?

धन्यवाद, हमेशा के रूप में।

उत्तर

5

आपका एकमात्र दृष्टिकोण HttpServletResponse ऑब्जेक्ट को लपेटना है ताकि कुकीज़ सेट होने पर addCookie विधियां अवरोध और लॉग हो सकें। आप ServletFilter को जोड़कर ऐसा कर सकते हैं जो आपके Servlet में पारित होने से पहले मौजूदा HttpServletResponse को लपेटता है।

14

लॉगिंग सब है, तो आप के बाद कर रहे हैं, तो मैं javax.servlet.Filter जो एक आवरण जो फिल्टर के बाद निष्पादित करता है आप कुकीज़ को बेनकाब करने के लिए अनुमति देता है में आपूर्ति HttpServletResponse लपेटता के अंतर्गत प्रयोग लेखन सुझाव देते हैं। कुछ इस तरह:

public class CookieLoggingFilter implements Filter { 

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException ,ServletException { 
     ResponseWrapper wrappedResponse = new ResponseWrapper((HttpServletResponse) response); 

     filterChain.doFilter(request, wrappedResponse); 

     // use a real logger here, naturally :) 
     System.out.println("Cookies: " + wrappedResponse.cookies); 
    } 

    private class ResponseWrapper extends HttpServletResponseWrapper { 

     private Collection<Cookie> cookies = new ArrayList<Cookie>(); 

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

     @Override 
     public void addCookie(Cookie cookie) { 
      super.addCookie(cookie); 
      cookies.add(cookie); 
     } 
    } 

     // other methods here 
} 

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

सुनिश्चित करने का एकमात्र तरीका Live Http Headers for Firefox, या मैन-इन-द-बीच HTTP लॉगिंग प्रॉक्सी जैसे ब्राउज़र प्लगइन का उपयोग करना है।

+0

शायद मैं कुछ याद कर रहा हूँ ... क्यों क्या आप अपने कंटेनर के मानक लॉगिंग (उदाहरण के लिए टोमकैट की 'एक्सेसलॉगवेलवे') का विस्तार नहीं कर सकते हैं और' हेड-कुकी 'लॉग इन करने के लिए प्रतिक्रिया हेडर फ़िल्टर कर सकते हैं? इससे आपको ब्राउज़र में सेट की जाने वाली निश्चित कुकीज़ को लॉग इन करने देना चाहिए। –

8

मुझे वही समस्या थी जहां मैं एक तृतीय पक्ष लाइब्रेरी का उपयोग कर रहा था जो एक HttpServletResponse स्वीकार करता है और मुझे अपनी प्रतिक्रिया ऑब्जेक्ट पर सेट की गई कुकीज़ को वापस पढ़ने की आवश्यकता होती है।

public class CookieAwareHttpServletResponse extends HttpServletResponseWrapper { 

    private List<Cookie> cookies = new ArrayList<Cookie>(); 

    public CookieAwareHttpServletResponse (HttpServletResponse aResponse) { 
     super (aResponse); 
    } 

    @Override 
    public void addCookie (Cookie aCookie) { 
     cookies.add (aCookie); 
     super.addCookie(aCookie); 
    } 

    public List<Cookie> getCookies() { 
     return Collections.unmodifiableList (cookies); 
    } 

} 

और जिस तरह से मैं इसे का उपयोग करें:: मैं कॉल करने के बाद हल करने के लिए है कि मैं एक HttpServletResponseWrapper विस्तार जो मेरे लिए इन कुकीज़ को उजागर करता बनाई

// wrap the response object 
CookieAwareHttpServletResponse response = new CookieAwareHttpServletResponse(aResponse); 

// make the call to the 3rd party library 
String order = orderService.getOrder (aRequest, response, String.class); 

// get the list of cookies set 
List<Cookie> cookies = response.getCookies(); 
संबंधित मुद्दे

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