Trong khi BalusC's answer sẽ làm việc trong hầu hết các tình huống bạn phải hãy cẩn thận với flush
gọi - nó cam kết phản ứng và không có văn bản khác để nó là có thể, ví dụ như. qua các bộ lọc sau. Chúng tôi đã tìm thấy một số vấn đề với cách tiếp cận rất tương tự trong môi trường Websphere nơi phản hồi được phân phối chỉ là một phần.
Theo số this question không nên gọi xả, bạn nên để nó được gọi nội bộ.
Tôi đã giải quyết vấn đề xả bằng cách sử dụng TeeWriter
(nó chia luồng thành 2 luồng) và sử dụng các luồng không đệm trong "luồng phân nhánh" cho mục đích ghi nhật ký. Nó là không cần thiết để gọi flush
sau đó.
private HttpServletResponse wrapResponseForLogging(HttpServletResponse response, final Writer branchedWriter) {
return new HttpServletResponseWrapper(response) {
PrintWriter writer;
@Override
public synchronized PrintWriter getWriter() throws IOException {
if (writer == null) {
writer = new PrintWriter(new TeeWriter(super.getWriter(), branchedWriter));
}
return writer;
}
};
}
Sau đó, bạn có thể sử dụng nó theo cách này:
protected void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException {
//...
StringBuilderWriter branchedWriter = new org.apache.commons.io.output.StringBuilderWriter();
try {
chain.doFilter(request, wrapResponseForLogging(response, branchedWriter));
} finally {
log.trace("Response: " + branchedWriter);
}
}
Mã này được đơn giản hóa cho brewity.
Nguồn
2016-10-18 11:47:05
Bạn viết câu trả lời bằng cách nào? 'response.getWriter(). write (yourResponseString)' ??? Hay bạn đang làm điều gì đó khác biệt? Bạn có muốn viết lỗi không? (Nói cách khác, bạn có muốn ghi lại phản hồi khi bạn đang thực hiện 'response.sendError (yourError)' ??) – Dave
có lẽ http://java.sun.com/blueprints/corej2eepatterns/Patterns/InterceptingFilter.html này và http://docstore.mik.ua/orelly/xml/jxslt/ch08_04.htm này có thể cung cấp cho bạn gợi ý –
@Dave chỉ sử dụng response.getWriter(). write (yourResponseString) như bạn đã đề cập và đó là kết quả cũ của tôi muốn chụp. – aloo