2016-11-01 1 views
1

Jetty를 사용하고 요청 매개 변수와 본문을 기록하고 싶습니다. 핸들러Jetty RequestLog - 요청 읽기 본문을 읽으십시오.

추가 AccessLogger : 나는 request.getReader()를 실행하려고하면

@Override 
public void log(Request request, Response response) { 
    request.getReader(); 
} 

문제는이 IllegalStateException: STREAMED를 말한다 :

ServletContextHandler servletContextHandler = new ServletContextHandler(); 
    ... 

    RequestLogHandler requestLogHandler = new RequestLogHandler(); 
    requestLogHandler.setRequestLog(new AccessLogger()); 

    HandlerCollection handlers = new HandlerCollection(); 
    handlers.setHandlers(new Handler[]{ 
      servletContextHandler, 
      requestLogHandler 
    }); 

AccessLogger는 RequstLog 인터페이스를 구현합니다. 이전 처리기가 이미 모든 데이터를 읽었 기 때문입니다. 그런데 내가 필요로하는 방식으로 어떻게 기록 할 수 있습니까?

답변

0

표준 서블릿 동작.

서블릿이 요청 본문 (getInputStream() 또는 getReader()을 통해 읽음)을 읽은 경우 다시 읽을 수 없습니다.

사용 된 기술 getReader() 또는 getInputStream()은 본문 내용이 어떻게 표시되었으며 변경할 수 없습니다.

  • getReader()을 사용한 경우에는 getInputStream()을 나중에 사용할 수 없습니다.
  • getInputStream()을 사용한 경우 getReader()은 나중에 사용할 수 없습니다.

자세한 내용은 getReader()getInputStream()에 대한 Javadoc을 참조하십시오.

+0

예, 그렇습니다. 그러나이 경우의 해결 방법은 무엇입니까? 여러 핸들러가있을 수 있으면 요청에서 모두 읽을 수 있어야합니다. 맞습니까? – awfun

+0

아니, 서블릿 사양에서 지원하지 않습니다. 필요하다면, 어딘가에 콘텐트를 읽고 캐시해야하며, 이후의 각 서블릿은 서블릿 API가 아닌 캐시 된 버전에 액세스해야합니다. Servlet 3.1과 Async I/O가 스펙에 추가 되었기 때문에 HttpServletRequest를 오버라이드/랩핑하는 복잡한 것을 생각해 낼 수 있습니다. –

관련 문제