2009-03-31 5 views

답변

27

필터 자바 파일이 추가

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

사용 추적 코드 :..

HttpServletResponse httpResponse = (HttpServletResponse) response; 
MyHttpServletResponseWrapper wrapper = 
    new MyHttpServletResponseWrapper(httpResponse); 

chain.doFilter(request, wrapper); 

String content = wrapper.toString(); 

내용 변수가 이제 출력 스트림을 가지고 또한 수 이진 콘텐츠 용으로 사용하십시오.

+1

서블릿 응답 랩퍼를 사용하고 작성된 출력을 캡처하는 것이 가장 좋은 방법이라고 생각합니다. – DyreSchlock

+1

요청을 처리하는 코드가 출력 스트림을 사용하고 있습니다. TeeOutputStream을 사용할 수 있습니다. (http://commons.apache.org/io/apidocs/org/apache/commons/io/output/TeeOutputStream.html) – DyreSchlock

+4

무엇이 합리적인 값인 'BUFFER_SIZE'입니까? – asgs

0

저는 HttpServletResponse 객체에서 데이터를 가져올 수 있다는 것을 많이 알지 못합니다. 요청이 적절한 핸들러로 프록시되고 적절한 최종 응답을 작성할 수있는 데이터 전송 오브젝트로 전달되도록 애플리케이션을 구조화하는 것이 더 적절할 수 있습니다. 이런 식으로 둘 이상의 응답 객체를 수정하거나 읽지 않아도됩니다.

직접적인 대답은 아닙니다. 알아요.하지만 그 질문을하는 방법입니다.

+1

궁극적으로, 나는 똑같은 일을하고 응답을 읽을 필요가없는 입장에 서게 될 것입니다. 그러나 실제로 사용하고있는 요청 처리는 상당히 까다 롭습니다. 따라서/ – DyreSchlock

1

출력 스트림에 쓰면 서블릿 필터가 채우기 후에 호출되기 전에 클라이언트에 데이터가 플러시 될 수 있으므로이 작업을 반드시 수행해야한다고 생각하지 않습니다. iftrue은 XML을 생성하고 원하는 출력 형식으로 다시 생성 할 수있는 다른 아키텍처를 제안합니다.

편집 : 당신이 정말 현재 처리를 방해 할 수없는 경우, iftrue 게시물에 대한 응답을 읽으면서, 아마도 당신은 귀하의 요청에 프록시 서블릿을 필요로 원래의 출력에서 ​​출력을 캡처, 그런 다음 적절하게 찌르십시오. 아주 불쾌한, 그러나

:-(
2

Spring에는 이제 메소드 [public] [] getContentAsByteArray()가있는 [ContentCachingResponseWrapper]를 사용하면됩니다.

I 기본 ResponseWrapper 또는 ContentCachingResponseWrapper를 사용할지 여부에 관계없이 구성 가능한 WrapperFactory를 만들 것을 제안합니다.

관련 문제