2009-03-31 28 views
25

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

27

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

+1

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

+1

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

+4

giá trị hợp lý của 'BUFFER_SIZE' là bao nhiêu? – asgs

0

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.

+1

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

1

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 :-(

2

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.

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