मैं 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;
}
};
}
क्या कोई बेहतर तरीका है? क्या हम धारा का उपभोग किए बिना पैरामीटर पढ़ सकते हैं? (चोटी के समान कुछ चीज) क्या हम स्ट्रीम को रीसेट कर सकते हैं?
क्या वेब पेज से मेटा डेटा को सर्वलेट कंटेनर में लाने का कोई वैकल्पिक तरीका है जिसके लिए अनुरोध निकाय में डेटा की आवश्यकता नहीं होती है? –
पोस्ट के बजाय जीईटी का उपयोग करें। या विशेष कार्यात्मक आवश्यकता के लिए वैकल्पिक दृष्टिकोण की तलाश करें ताकि आपको शरीर को कई बार पढ़ने की आवश्यकता न हो। – BalusC
@UsmanIsmail: एक बार इनपुटस्ट्रीम पढ़ें, इसे बफर करें और इसे विभिन्न घटकों के चारों ओर पास करें जिन्हें इसे पढ़ने की आवश्यकता होगी – Jim