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?
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? –
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
@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