2011-05-03 2 views
3

쿼리 문자열의 매개 변수와 본문의 JSON 개체가 포함 된 응용 프로그램의 POST 요청을 처리하는 HttpServlet을 개발 중입니다. 양식 게시가 아니며 전체 본문이 JSON 개체입니다. 시신을 읽으려면 HttpServletRequest.getReader()을 사용해야 함을 이해합니다. 그러나 쿼리 매개 변수를 가져 오려면 HttpServletRequest.getParameter()을 사용해야합니다. 그리고 저는이 두 가지를 모두 사용할 수 없다는 것을 알고 있습니다.HttpServletRequest getParameter 및 getReader

의도 한 솔루션은 HttpServletRequestWrapper을 만들고 두 번 이상 호출 할 수있는 방식으로 getReader()을 재정의하는 것이라고 생각합니다. 그러나 나는 그것을하는 방법을 이해할 수 없다. 또는 이것은 의도 된 접근 방식이 아닐 수도 있습니다. 내가 찾을 수있는 HttpServletRequestWrapper의 모든 예는 필터를 만들고 요청 내용을 수정하는 것과 관련이있는 것 같습니다.

도움을 주시면 대단히 감사하겠습니다.

현재 Google App Engine에 호스팅되어 있지만 솔루션에 영향을 미치지 않는다고 생각합니다.

+1

"내가 모두 사용할 수 없음을 이해 "... 이것은 사실이 아닙니다. 둘 다 문제없이 사용할 수 있습니다. – skaffman

+5

@skaffman : 이것은 사실이 아닙니다. 'getParameter()'의 마지막 단락을 읽으십시오. javadoc http://download.oracle.com/javaee/6/api/javax/servlet/ServletRequest.html#getParameter%28java.lang.String%29 POST 매개 변수가 요청으로 전송됩니다. 신체. 따라서 아직 파싱되지 않았고 본문을 읽으면'getParameter()'를 사용할 수 없으며 그 반대의 경우도 마찬가지입니다. – BalusC

+0

@BalusC : OP는 매개 변수가 본문이 아니라 쿼리 문자열에 있음을 나타냅니다 (즉, 양식 인코딩되지 않았습니다). 이것은 POST에도 허용됩니다. – skaffman

답변

1

나는 당신이 당신의 HttpServletRequestWrappergetReader() 다중 호출을 구현할 수 있다고 생각 :

  1. 임시 파일에 HTTP 요청 본문을 저장합니다.
  2. HttpServletRequestWrapper.getReader()이 호출되면 임시 파일을 엽니 다.
  3. 요청 처리가 끝나면 임시 파일을 삭제하십시오.

(1) 및 (3)을 구현하기 위해, ServletFilter이 유용 할 수있다.

+2

본문을 저장하려면 기본 HttpServletRequest에서 getReader()를 호출해야합니다. 즉, getParameters()와 같은 모든 호출이 실패합니다. 모든 매개 변수와 헤더 및 모든 것을 직접 파싱해야합니까? – Darrell

1

쿼리 문자열을 구문 분석하여 을 직접 쿼리 문자열 매개 변수를 읽는 것이 좋습니다. 이렇게하면 메시지 본문을 만지지 않고 HttpServletRequest.getReader()을 사용할 수 있습니다. 쿼리 문자열을 구문 분석

까다 롭습니다 그러나 여기에서 논의 된 바와 같이 거기는 아파치 HTTP 클라이언트 패키지에서 URLEncodedUtils를 사용하여 안전하게 수행 할 수 있습니다

관련 문제