2012-04-26 32 views
5

tôi đang xem xét việc thực hiện HiddenMethodFilter trong sitebricks here:Có thể đọc các tham số HttpRequest mà không cần sử dụng luồng không?

Tại dòng 65 có đoạn mã sau:

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

Nó sẽ kiểm tra nếu một tham số cụ thể đã được thiết lập và sử dụng đó để quấn theo yêu cầu . Tuy nhiên, khi đọc tham số đó, nó sẽ tiêu thụ luồng và servlet cuối cùng sẽ không thể đọc bất kỳ dữ liệu nào.

Cách tốt nhất để tránh điều này là gì? Tôi đã triển khai HttpServletRequestWrapper here đọc nội dung của luồng vào một mảng byte. Tuy nhiên, điều này có thể sử dụng rất nhiều bộ nhớ để lưu trữ các yêu cầu.

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; 
    } 
}; 
} 

Có cách nào tốt hơn không? chúng ta có thể đọc tham số mà không cần dùng luồng không? (Một số điều tương tự như peek) chúng ta có thể thiết lập lại các dòng?

Trả lời

2

Nếu bạn đang sử dụng POST yêu cầu và đọc thông số từ httpRequest, điều này sẽ ảnh hưởng đến InputStream và bạn sẽ gặp sự cố ở các phần khác cần đọc nó.
Điều này được nêu trong ServletRequest#getParameter javadoc:

Nếu dữ liệu tham số được gửi trong cơ thể yêu cầu, chẳng hạn như xảy ra với một yêu cầu HTTP POST, sau đó đọc cơ thể trực tiếp thông qua getInputStream() hoặc getReader() có thể can thiệp vào việc thực hiện phương pháp này.

Các ServletInputStream có nguồn gốc từ InputStream và thừa hưởng các markSupportedreset vv mà thực sự là không-ops và do đó bạn không thể đặt lại một ServletInputStream.
Điều này có nghĩa là bạn sẽ phải tiêu thụ nó.

+0

Có cách nào khác để lấy dữ liệu meta từ trang web vào thùng chứa servlet không yêu cầu dữ liệu ở trong phần yêu cầu không? –

+0

Sử dụng GET thay vì POST. Hoặc tìm cách tiếp cận thay thế cho yêu cầu chức năng cụ thể để bạn không cần đọc nội dung nhiều lần. – BalusC

+0

@UsmanIsmail: Đọc dòng đầu vào một lần, đệm nó và chuyển nó đến các thành phần khác nhau cần đọc nó – Jim

Các vấn đề liên quan