2014-02-13 2 views
0

최근에 Jetty 9.1.0을 사용하여 응용 프로그램을 개발하기 시작했습니다. Tomcat 7을 사용하여 동일한 응용 프로그램을 실행합니다. POST 요청은 우리가 사용하는 요청 본문 읽기 발생할 때마다 : 톰캣에서Jetty 요청 본문 읽기가 IndexOutOfBoundsException이됩니다.

private static String readRequestData(HttpServletRequest request) throws IOException 
{ 
    BufferedReader r = request.getReader(); 
    if (request.getContentLength() > 0) 
    { 
     int len = request.getContentLength(); 

     char[] buf = new char[len]; 
     int read = 0; 
     int readTo = 0; 
     while (read > -1) 
     { 
      read = r.read(buf, readTo, 1000); 
      readTo += read; 
     } 
     return new String(buf); 
    } 
    return ""; 
} 

을의 BufferedReader 객체는 org.apache.catalina.connector.CoyoteReader과 데이터가 올바르게 읽혀진다. Jetty 아래의 독자는 org.eclipse.jetty.server.Request이며, 두 번째로 루프를 통해 java.lang.IndexOutOfBoundsException이 발생합니다. 두 번째 시간을 읽으려고하면 예외가 throw됩니다. 루프를 통해 두 번째로 읽을 수는 없지만 혼란 스럽습니다.

우리가 잘못하고있는 것에 대한 지침을 제공하는 사람은 누구입니까?

감사합니다. 위의 코드에서

답변

2
char[] buf = new char[len]; 
     int read = 0; 
     int readTo = 0; 
     while (read > -1) 
     { 
      read = r.read(buf, readTo, 1000); 
      readTo += read; 
     } 

당신이하는는, 특정 배열 buf에 'request.getReader'의 내용 및 방법 read 1000 문자를 읽고는 루프가 1000+readTo+........

로 문자 크기 증가의 최소 요구 사항을 증가 readTo이 .as에서 시작
1st Iteration -> char elements are added from index 0 - 1000 
2nd Iteration -> char elements are added from index 1000 - 2000 

그래서 문제는 배열의 크기가 char 배열를 대상으로 더 큰 2000

+0

보다해야한다는 확인할 수 있습니다 두번째 반복에서 발생합니다. 이 코드는 Tomcat에서 작동하므로 BufferedReader 구현의 차이점이 있음을 기억하십시오. http://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html#read (char [], int, int) –

+0

@ToddChapman 예 편집했습니다. – Kick

+0

당신이 제안한 것은 효과가있었습니다. CoyoteReader가 buf가 끝날 때 멈추지 만 Jetty 구현에서는 멈추지 않는 것이 궁금합니다. –