본문 바로가기
DEVELOPER HARRY/Good to know (ERROR, Shortcuts)

ERROR#1.java.lang.IllegalStateException: Cannot forward after response has been committed

by 갈색토마토 2020. 12. 4.

안녕하세요. Harry입니다.

 

ERROR LOG#1 

java.lang.IllegalStateException: Cannot forward after response has been committed 

forward를 사용 시 Cannot forward after response has been committed 예외

 

1
2
3
4
5
6
java.lang.IllegalStateException: Cannot forward after response has been committed
     at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:328)
     at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:318)
     at org.apache.jsp.dispatcher_jsp._jspService(dispatcher_jsp.java:138)
     at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
cs

원인?

RequestDispatcher의 메서드 중 forward()는 현재 페이지의 로직을 처리 후 제어를 호출하는 페이지로 넘기게 됩니다.

즉, 제어가 넘어간 화면에서 최종 결과를 브라우저로 출력하는 형태로 동작하는 메서드입니다.

 

forward()를 호출하는 시점에서 그 전 request에서 출력 버퍼에 담아두었던 출력 내용들은

비워지게 되고 제어를 넘기게 됩니다.(A:호출 화면 -> B 화면)

 

만약 forward() 이전에 강제로 out.flush() 를 통해 버퍼의 내용을 출력하고 나서 forward()를 호출하는

경우에는 "java.lang.IllegalStateException:Cannot forward after response has been committed "

예외가 발생하게 됩니다.

 

java.lang.IllegalStateException 이미지 #1

위와 같이 out.flush();를 하고

request.setAttribute("url", url); 을 하하여 forward() 하게 되면 예외가 발생하는 것입니다.

 

따라서 이러한 경우에는 forward()의 사용이 아닌,

이전 화면의 내용을 유지한 상태에서 제어를 넘겨야 하므로, include(); 메서드를 사용하여야 합니다.

 

 


이상으로 에러 로그 기록을 마치겠습니다.

Harry 올림

 

댓글