request에서 json형태의 parameter의 값 가져오기
- 작성자 :
- 최*
- 작성일 :
- 2014-01-15 14:48:33
- 조회수 :
- 2,101
- 구분 :
- 기타
- 진행상태 :
- 완료
Q
수고하십니다. 일전에 웹로그를 처리하는 EgovWebLogInterceptor 클래스에서 request의 모든 파라미터를 가져오는 부분에 대한 문의를 드려 답변을 받았습니다.
보내주신 내용으로 소스변경을 하여 처리를 하려고 하다보니 현재 진행중인 프로젝트에서는 파라미터를 key가 없는 json형태로 받아서 처리를 하고 있어 request.getParameterNames(), request.getParameterMap() 둘다 사용하지 못하고 있습니다.
파라미터는 키가 없이 {"left_id":"200"} 이런형태로 넘어옵니다.
그래서 preHandle쪽에
StringBuffer json = new StringBuffer();
String line = null;
try {
BufferedReader reader = request.getReader();
logger.info(reader);
와 같이 request를 가져오니 파라미터를 읽을 수는 있으나 request에서 이미 파라미터를 사용하여 웹로그를 저장 후 이후 비지니스로직이 처리되지 않고 Exception을 내버리더군요.
혹시 getReader 메소드를 사용하지 않는 방법이나, getReader를 쓰더라도 이후 비지니스로직이 정상적으로 처리될 수 있는 방법이 있는지 문의드립니다.
아래는 로그의 일부입니다.
2014-01-15 14:16:09,662 INFO [egovframework.com.sym.log.wlg.web.EgovWebLogInterceptor] {"left_id":"200"}
2014-01-15 14:16:09,725 DEBUG [org.springframework.web.servlet.DispatcherServlet] Handler execution resulted in exception - forwarding to resolved error view: ModelAndView: reference to view with name 'cmmn/bizError'; model is {exception=java.lang.IllegalStateException: getReader() has already been called for this request}
java.lang.IllegalStateException: getReader() has already been called for this request
보내주신 내용으로 소스변경을 하여 처리를 하려고 하다보니 현재 진행중인 프로젝트에서는 파라미터를 key가 없는 json형태로 받아서 처리를 하고 있어 request.getParameterNames(), request.getParameterMap() 둘다 사용하지 못하고 있습니다.
파라미터는 키가 없이 {"left_id":"200"} 이런형태로 넘어옵니다.
그래서 preHandle쪽에
StringBuffer json = new StringBuffer();
String line = null;
try {
BufferedReader reader = request.getReader();
logger.info(reader);
와 같이 request를 가져오니 파라미터를 읽을 수는 있으나 request에서 이미 파라미터를 사용하여 웹로그를 저장 후 이후 비지니스로직이 처리되지 않고 Exception을 내버리더군요.
혹시 getReader 메소드를 사용하지 않는 방법이나, getReader를 쓰더라도 이후 비지니스로직이 정상적으로 처리될 수 있는 방법이 있는지 문의드립니다.
아래는 로그의 일부입니다.
2014-01-15 14:16:09,662 INFO [egovframework.com.sym.log.wlg.web.EgovWebLogInterceptor] {"left_id":"200"}
2014-01-15 14:16:09,725 DEBUG [org.springframework.web.servlet.DispatcherServlet] Handler execution resulted in exception - forwarding to resolved error view: ModelAndView: reference to view with name 'cmmn/bizError'; model is {exception=java.lang.IllegalStateException: getReader() has already been called for this request}
java.lang.IllegalStateException: getReader() has already been called for this request
A
안녕하세요. 최헌님.
request의 파라미터가 아닌 내용 부분의 데이터를 filter나 interceptor에서 보관하시는 경우라면, 일반적인 방법으로는 처리가 어려우실 것 같습니다.
(Reader나 InputStream을 이중으로 읽는 것은 일반적으로는 지원하지 않습니다.)
이 경우는 다음과 같이 읽은 데이터를 별도로 보관하신 후에 HttpServletRquestWrapper를 통해 다시 한번 뒤쪽(Controller)에게 전달하는 방법이 가능할 것 같습니다.
1. Reader로 부터 데이터를 읽고, 별도에 byte[]에 보관
2. 1번의 byte[]를 통해 BufferedReader 생성
3. getReader()가 2번의 Reader를 리턴하도록 override하는 HttpServletRquestWrapper 생성 (상속 처리)
4. 3번의 wrapper를 filter chain 상에 전달
그럼, 즐거운 하루되십시오.
감사합니다.
request의 파라미터가 아닌 내용 부분의 데이터를 filter나 interceptor에서 보관하시는 경우라면, 일반적인 방법으로는 처리가 어려우실 것 같습니다.
(Reader나 InputStream을 이중으로 읽는 것은 일반적으로는 지원하지 않습니다.)
이 경우는 다음과 같이 읽은 데이터를 별도로 보관하신 후에 HttpServletRquestWrapper를 통해 다시 한번 뒤쪽(Controller)에게 전달하는 방법이 가능할 것 같습니다.
1. Reader로 부터 데이터를 읽고, 별도에 byte[]에 보관
2. 1번의 byte[]를 통해 BufferedReader 생성
3. getReader()가 2번의 Reader를 리턴하도록 override하는 HttpServletRquestWrapper 생성 (상속 처리)
4. 3번의 wrapper를 filter chain 상에 전달
그럼, 즐거운 하루되십시오.
감사합니다.