2012-04-26 14 views
5

मैं sitebricks here में HiddenMethodFilter के कार्यान्वयन से देख रहा हूँ:क्या स्ट्रीमिंग के बिना HttpRequest पैरामीटर पढ़ना संभव है?

लाइन 65 पर

वहाँ निम्नलिखित कोड है:

try { 
    String methodName = httpRequest.getParameter(this.hiddenFieldName); 
    if ("POST".equalsIgnoreCase(httpRequest.getMethod()) && !Strings.empty(methodName)) { 
    .... 

यह जाँच करता है अगर एक विशिष्ट पैरामीटर स्थापित किया गया था और उस अनुरोध रैप करने के लिए उपयोग करता है । हालांकि, उस पैरामीटर को पढ़ने में यह स्ट्रीम का उपभोग करेगा और अंतिम सर्वलेट किसी भी डेटा को पढ़ने में सक्षम नहीं होगा।

इससे बचने का सबसे अच्छा तरीका क्या होगा? मैंने HttpServletRequestWrapper here लागू किया जो स्ट्रीम की सामग्री को बाइट सरणी में पढ़ता है। हालांकि यह अनुरोधों को संग्रहीत करने के लिए बहुत सारी मेमोरी का उपयोग कर सकता है।

private HttpServletRequestWrapper getWrappedRequest(HttpServletRequest httpRequest, final byte[] reqBytes) 
    throws IOException { 

final ByteArrayInputStream byteInput = new ByteArrayInputStream(reqBytes); 
return new HttpServletRequestWrapper(httpRequest) { 

    @Override 
    public ServletInputStream getInputStream() throws IOException { 
    ServletInputStream sis = new ServletInputStream() { 

     @Override 
     public int read() throws IOException { 
     return byteInput.read(); 
     } 
    }; 
    return sis; 
    } 
}; 
} 

क्या कोई बेहतर तरीका है? क्या हम धारा का उपभोग किए बिना पैरामीटर पढ़ सकते हैं? (चोटी के समान कुछ चीज) क्या हम स्ट्रीम को रीसेट कर सकते हैं?

उत्तर

2

यदि आप POST अनुरोधों का उपयोग कर रहे हैं और httpRequest से पैरामीटर पढ़ रहे हैं तो यह InputStream को प्रभावित करेगा और आपको अन्य भागों में इसे पढ़ने की आवश्यकता होगी। ,

पैरामीटर डेटा अनुरोध शरीर भेजा गया था तो एक HTTP POST अनुरोध के साथ होता है जैसे, तो शरीर सीधे पढ़ getInputStream() या getReader के माध्यम से():
यह ServletRequest#getParameter जावाडोक में कहा गया है इस विधि को के निष्पादन में हस्तक्षेप कर सकते हैं।

ServletInputStreamInputStream से ली गई और विरासत है markSupportedreset आदि जो वास्तव में कोई-ऑप्स हैं और इसलिए आप एक ServletInputStream रीसेट नहीं कर सकते।
इसका मतलब है कि आपको इसे उपभोग करना होगा।

+0

क्या वेब पेज से मेटा डेटा को सर्वलेट कंटेनर में लाने का कोई वैकल्पिक तरीका है जिसके लिए अनुरोध निकाय में डेटा की आवश्यकता नहीं होती है? –

+0

पोस्ट के बजाय जीईटी का उपयोग करें। या विशेष कार्यात्मक आवश्यकता के लिए वैकल्पिक दृष्टिकोण की तलाश करें ताकि आपको शरीर को कई बार पढ़ने की आवश्यकता न हो। – BalusC

+0

@UsmanIsmail: एक बार इनपुटस्ट्रीम पढ़ें, इसे बफर करें और इसे विभिन्न घटकों के चारों ओर पास करें जिन्हें इसे पढ़ने की आवश्यकता होगी – Jim

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