दिलचस्प पोस्ट
अलामॉफ़र का उपयोग कर पैरामीटर के साथ फ़ाइल अपलोड करना सी रनटाइम लाइब्रेरी क्या है? JTree में JTable रखें PHP में स्ट्रिंग के सभी क्रमपरिवर्तन कैसे उत्पन्न करें? h: संदेश संदेश प्रदर्शित नहीं करते जब p: command बटन दबाया जाता है बेजियर वक्र और कैनवास एनएटी में कोड का उपयोग कर डेस्कटॉप वॉलपेपर बदलें संसाधन बंडल में एन्यूम मूल्यों को स्थानीयकरण करना क्या जावास्क्रिप्ट में "वापसी! 0" का उपयोग करने का कोई मतलब है? आत्म संदर्भ क्या क्लास पुस्तकालय में एक App.config फ़ाइल हो सकती है? इकाई फ़्रेमवर्क के साथ डेटाअनोटेशन का उपयोग करना धागे की सूची प्राप्त करें जावास्क्रिप्ट: कक्षा। विधि बनाम कक्षा। प्रोटोपीपी। विधि रिफैक्टरिंग अगर / अन्य तर्क

प्रतिक्रिया शरीर पर कब्जा और लॉग इन करें

मेरे पास एक सर्वलेट है जो कुछ HTTP अनुरोधों और प्रतिक्रियाओं को संभालता है। मैं ग्राहक को वापस भेजने से पहले प्रतिक्रिया शरीर लॉग करना चाहता हूँ। क्या ऐसा कोई तरीका है कि मैं HttpServletResponse से HttpServletResponse रिस्पॉन्स ऑब्जेक्ट के रूप में भेजने से पहले प्रतिक्रिया वाले शरीर को कैप्चर कर सकता हूं?

Solutions Collecting From Web of "प्रतिक्रिया शरीर पर कब्जा और लॉग इन करें"

अगर मैं आपको सही ढंग से समझता हूं, तो आप प्रतिक्रिया शरीर लॉग इन करना चाहते हैं? यह एक बहुत महंगा काम है, लेकिन अगर यह व्यवसाय की आवश्यकता है …

@ डीफिमो के अनुसार, इस के लिए एक Filter एक उपयुक्त स्थान है। आप HttpServletResponse#getWriter() कार्यान्वयन के साथ पारित-इन HttpServletResponse#getWriter() को प्रतिस्थापित करते हुए प्रतिक्रिया वाले शरीर को कैप्चर कर सकते हैं, जो HttpServletResponse#getWriter() अपने खुद के कार्यान्वयन के साथ बदलता है जो कुछ बफ़र में प्रतिसाद निकाय की प्रतिलिपि बनाता है। प्रतिस्थापित प्रतिक्रिया के साथ फ़िल्टर श्रृंखला जारी रखने के बाद, बस प्रतिलिपि लॉग करें

यहां एक doFilter() उदाहरण है कि कैसे doFilter() विधि कैसा दिख सकती है:

 public void doFilter(ServletRequest request, final ServletResponse response, FilterChain chain) throws IOException, ServletException { final CopyPrintWriter writer = new CopyPrintWriter(response.getWriter()); chain.doFilter(request, new HttpServletResponseWrapper((HttpServletResponse) response) { @Override public PrintWriter getWriter() { return writer; } }); logger.log(writer.getCopy()); } 

यहां बताया गया है कि CopyPrintWriter कैसा CopyPrintWriter सकता है:

 public class CopyPrintWriter extends PrintWriter { private StringBuilder copy = new StringBuilder(); public CopyPrintWriter(Writer writer) { super(writer); } @Override public void write(int c) { copy.append((char) c); // It is actually a char, not an int. super.write(c); } @Override public void write(char[] chars, int offset, int length) { copy.append(chars, offset, length); super.write(chars, offset, length); } @Override public void write(String string, int offset, int length) { copy.append(string, offset, length); super.write(string, offset, length); } public String getCopy() { return copy.toString(); } } 

url-pattern लिए इस फ़िल्टर को मैप करें, जिसके लिए आप प्रतिक्रियाओं को लॉग करना चाहते हैं। ध्यान रखें कि द्विआधारी / स्थैतिक सामग्री जैसे छवियां, सीएसएस, जेएस फाइलें और इसी तरह से इस तरह से लॉग नहीं होगा। आप उन्हें विशिष्ट url-pattern का उपयोग करके बाहर निकालना चाहते हैं, जैसे *.jsp या बस *.jsp servlet-name पर servlet-name अगर आप किसी भी तरह से द्विआधारी / स्थैतिक सामग्री को लॉग ऑन करना चाहते हैं (जिसके लिए मुझे कोई लाभ नहीं मिला है), तो आपको HttpServletResponse#getOutputStream() को उसी तरह से बदलना होगा।

हो सकता है कि सर्वलेट फ़िल्टर आपकी मदद कर सकता है HTTP के लिए पहलू-उन्मुख प्रोग्रामिंग के रूप में इसे सोचें

BalusC के एक विकल्प का विकल्प TeeOutputStream का उपयोग समय पर दो आउटपुटस्ट्रीम में लिखने के लिए करता है।

 public void doFilterInternal(HttpServletRequest req, HttpServletResponse res, FilterChain chain) throws IOException, ServletException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); final PrintStream ps = new PrintStream(baos); chain.doFilter(req,new HttpServletResponseWrapper(res) { @Override public ServletOutputStream getOutputStream() throws IOException { return new DelegatingServletOutputStream(new TeeOutputStream(super.getOutputStream(), ps) ); } @Override public PrintWriter getWriter() throws IOException { return new PrintWriter(new DelegatingServletOutputStream (new TeeOutputStream(super.getOutputStream(), ps)) ); } }); //Get Response body calling baos.toString(); } 

मैं एक आउटपुटस्ट्रीम संस्करण को तृतीय पक्ष निर्भरता के बिना बना देता हूं, @पार्डबर्ग के समान। आप इस लिंक में पा सकते हैं