Tôi muốn tạo bộ lọc Servlet sẽ đọc nội dung của Phản hồi sau khi nó được xử lý và hoàn thành và trả về thông tin đó bằng XML hoặc PDF hoặc bất kỳ thứ gì. Nhưng tôi không chắc chắn làm thế nào để có được bất kỳ thông tin nào từ đối tượng HttpServletResponse. Làm thế nào tôi có thể nhận được thông tin này?Làm cách nào để đọc luồng đầu ra HttpServletReponses?
Trả lời
Thêm phần này vào tập tin lọc java
static class MyHttpServletResponseWrapper
extends HttpServletResponseWrapper {
private StringWriter sw = new StringWriter(BUFFER_SIZE);
public MyHttpServletResponseWrapper(HttpServletResponse response) {
super(response);
}
public PrintWriter getWriter() throws IOException {
return new PrintWriter(sw);
}
public ServletOutputStream getOutputStream() throws IOException {
throw new UnsupportedOperationException();
}
public String toString() {
return sw.toString();
}
}
Sử dụng mã sau:..
HttpServletResponse httpResponse = (HttpServletResponse) response;
MyHttpServletResponseWrapper wrapper =
new MyHttpServletResponseWrapper(httpResponse);
chain.doFilter(request, wrapper);
String content = wrapper.toString();
Biến nội dung hiện nay có dòng đầu ra Bạn cũng có thể làm điều đó cho nội dung nhị phân
Tôi không biết rằng bạn có thể lấy dữ liệu ra khỏi đối tượng HttpServletResponse như vậy. Nó có thể có ý nghĩa hơn trong việc cấu trúc ứng dụng của bạn sao cho các yêu cầu được đưa tới các trình xử lý thích hợp và truyền với các đối tượng truyền dữ liệu, từ đó bạn có thể xây dựng đáp ứng cuối cùng thích hợp. Theo cách này, bạn không bao giờ modifiy nhiều hơn một đối tượng phản ứng hoặc cần phải đọc từ đó.
Không phải là câu trả lời trực tiếp, tôi biết, nhưng đó là cách tôi làm điều đó cho câu hỏi.
Cuối cùng, tôi sẽ làm điều tương tự và đặt mình vào vị trí mà tôi sẽ không phải đọc cho câu trả lời. Nhưng quá trình xử lý yêu cầu thực sự tôi đang sử dụng là khá màu đen và không thể bị rối tung với:/ – DyreSchlock
Tôi không tin rằng bạn nhất thiết phải làm điều này vì việc ghi vào luồng đầu ra có thể dẫn đến dữ liệu bị xóa cho máy khách trước khi bất kỳ bộ lọc servlet nào được gọi sau bài viết. Khi iftrue gợi ý, kiến trúc khác sẽ được khuyến khích, để tạo XML của bạn (nói) và sau đó tạo lại ở bất kỳ định dạng đầu ra nào bạn mong muốn.
EDIT: Sau khi đọc câu trả lời của bạn để iftrue 's gửi bài, nếu bạn thực sự không thể can thiệp vào việc xử lý hiện tại, có lẽ bạn cần một servlet để proxy yêu cầu của bạn, bắt đầu ra từ đầu ra ban đầu, và sau đó lao vào thích hợp. Rất khó chịu, tuy nhiên :-(
Mùa xuân hiện có tính năng cho nó. Tất cả những gì bạn cần làm là sử dụng [ContentCachingResponseWrapper], có phương thức public byte [] getContentAsByteArray().
Tôi đề nghị tạo WrapperFactory để cho phép cấu hình, cho dù sử dụng ResponseWrapper hoặc ContentCachingResponseWrapper mặc định.
- 1. Làm cách nào để đệm luồng đầu vào/đầu ra/tệp Java của tôi đúng cách?
- 2. Cách đọc luồng đầu vào http
- 3. Làm thế nào để đọc đầu ra của véc ni?
- 4. C++ kết nối luồng đầu ra với luồng đầu vào
- 5. PHP: luồng đầu ra gần
- 6. Làm cách nào để dễ dàng thụt lề đầu ra cho luồng?
- 7. Java verbose: gc Cách đọc đầu ra?
- 8. Làm cách nào để tùy chỉnh đầu ra của Jenkins?
- 9. Đọc luồng đầu vào USB trên linux
- 10. Cách tốt nhất để đọc đầu ra của lệnh shell
- 11. Làm cách nào để đọc đầu ra của lệnh IPython% prun (profiler)?
- 12. Cách đọc và sao chép nội dung luồng đầu ra phản hồi servlet HTTP để ghi nhật ký
- 13. Quy trình Java với luồng đầu vào/đầu ra
- 14. Viết chuỗi vào luồng đầu ra
- 15. C++ luồng đầu ra tùy chỉnh với thụt đầu dòng
- 16. Đọc bộ đệm/luồng đầu ra phản hồi với supertest/superagent trên máy chủ node.js
- 17. Tại sao WCF đọc luồng đầu vào EOF trên Close()?
- 18. Cách đọc đầu ra của sed thành biến số
- 19. Cách đọc đầu ra nhật ký của NSAutoresizingMaskLayoutConstraint?
- 20. Làm thế nào để đọc đầu ra của lệnh xử lý android
- 21. Làm cách nào để tạo đầu ra cột trong Perl?
- 22. Làm cách nào để chuyển hướng đầu ra trong web.py
- 23. Làm cách nào để xem đầu ra gỡ lỗi gstreamer?
- 24. Làm cách nào để tô màu đầu ra git-status?
- 25. Làm cách nào để xác thực đầu ra của XmlSerializer?
- 26. Tăng iostreams: Cách tạo luồng TCP (để đọc) TCP?
- 27. Cách đọc đầu ra liên kết VC++ chi tiết
- 28. Luồng socket/đầu ra java viết: chúng có chặn không?
- 29. Đọc XML từ Luồng
- 30. Làm thế nào để đọc đầu ra số liệu thống kê uwsgi
Vâng, sử dụng một Servlet Reponse Wrapper và capture output khi nó được viết là cách tốt nhất để làm điều đó, tôi nghĩ vậy. – DyreSchlock
Mã xử lý yêu cầu đang sử dụng luồng đầu ra. TeeOutputStream có thể được sử dụng. (http://commons.apache.org/io/apidocs/org/apache/commons/io/output/TeeOutputStream.html) – DyreSchlock
giá trị hợp lý của 'BUFFER_SIZE' là bao nhiêu? – asgs