반응형

스프링(Spring)에서 컨트롤러를 호출하기 전과 후로 interceptor가 동작하여 preHandle과 postHandle를 수행한다. GETinputstream() has already been called for this request 이 문제는 GETinputstream()을 2번 이상 사용할 때 발생하는 문제다. 그래서, 이 문제를 해결하려면 2번 이상 호출을 하지 않게 만들면 된다.


목차

1. 원인 및 해결방법

1. 원인

JSP에서 이미지 파일 여러 개를 ajax를 통해 보내려고 했는데, GETinputstream() has already been called for this request 이 문제가 발생했다.

 

스프링 프레임워크에서 컨트롤러를 호출하기 전과 후로, servlet.xml에서 설정해놨던 Interceptor를 실행하여 작업을 수행한다. interceptor를 보게 되면, 컨트롤러의 Requestbody에서 데이터를 가져오기 전에 이미 아래와 같이, request.getReader()를 통해 데이터를 가져온다.

BufferedReader reader = request.getReader();

 

 

그렇기 때문에 위와 같이 에러가 발생한다. 

 

2. 해결방법

해결 방법은 정말 간단하다. 아래의 코드와 같이, CommonInterceptor.java의 readJSONStringFromRequestBody에서 reqeust.getReader()를 통해 데이터를 가져 온다. 그래서 이 메서드를 타는 기준을 보니, 프론트에서 URL을 입력할 때, json이라는 url이 포함되어 있으면 이것을 타게 했는데, url에서 json을 빼면 문제가 바로 완치다. 

 

[CommonInterceptor.java]

public String readJSONStringFromRequestBody(HttpServletRequest request) {
	StringBuffer json = new StringBuffer();
	String line = null;
    
	try {
		BufferedReader reader = request.getReader();
		while ((line = reader.readLine()) != null) {
			json.append(line);
		}
	} catch (Exception e) {
		log.error("Error reading JSON string", e);
	}
	return json.toString();
}

 

아래의 test01.jsp에서 url에 json이 들어가면, CommonInterceptor.java를 타게 되면서 request.reader가 1번 실행이 되고, 다시 컨트롤러를 호출하면서 RequestBody를 통해 다시 request.reader가 실행이 된다. 그렇기 때문에 에러가 발생한 것이었고, url에 json만 빼면 해결이다.

[test01.jsp]

$("#imageUp").ajaxSubmit({
  url : '/test/test01/imgTEST.data',
  type:'POST',
  async: false,
  enctype: 'multipart/form-data',
  processData: false,
  contentType: false
});

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기