기억의 DataBase

redirect와 forward 본문

JSP&Servlet

redirect와 forward

Zester; 2019. 2. 19. 14:21
  • 리다이렉트(redirect)
리다이렉트는 HTTP프로토콜로 정해진 규칙이다.
서버는 클라이언트의 요청에 대해 특정 URL로 이동을 요청할 수 있다. 이를 리다이렉트라고 한다.

         1. 브라우저가 redirect01.jsp를 서버에 요청

 

2. 요청을 받은 서버는 브라우져에게
    redirect01.jsp 파일내의 response.sendRedirect("redirect02.jsp");
코드에 따라
    HTTP 상태코드 302응답(response)하게되며,
    헤더 내의 Location이동할 URL(redirect02.jsp)를 추가하여
    브라우져에게 그 URL로 이동할 것을 요청(이 단계가 redirect)

 

3. 브라우져는 302 코드로 응답받게 되면 헤더내의 Location에 포함된 이동할 URL(redirect02.jsp)로 
   서버에 재요청을 하게됨
(이때 브라우져의 주소창이 새 URL(redirect02.jsp)로 바뀜)    

 

         4. 새로운 요청을 받은 서버는 HTTP 상태코드 200(정상응답)과 함께 
            새롭게 요청한 URL(redirect02.jsp) 페이지 결과를 브라우져에 돌려줌 

※ 서블릿이나 JSP는 리다이렉트하기 위해 HttpServletResponse 클래스의 sendRedirect() 메소드를 사용한다.

HTTP 서버응답 코드 참고 : https://ooz.co.kr/260

  • 포워드(forward)
WAS의 서블릿이나 JSP가 요청을 받은 후 그 요청을 처리하다가,
추가적인 처리를 같은 웹 어플리케이션안에 포함된 다른 서블릿이나 JSP에게 위임하는 경우

  1. 웹 브라우저에서 Servlet1에게 요청을 보냄
  1. Servlet1은 요청을 처리한 후, 그 결과를 HttpServletRequest 객체에 저장
  1. Servlet1은 결과가 저장된 HttpServletRequest 객체와 응답을 위한 HttpServletResponse 객체
    같은 웹 어플리케이션 안에 있는 Servlet2에게 전송(이 단계를 forward라고 함)
  1. Servlet2는 Servlet1으로 부터 받은 HttpServletRequest 객체와 HttpServletResponse 객체를 이용하여
    요청을 처리한 후 웹 브라우저에게 결과를 전송

  • forward Code로 구현


    

주소가 바뀌지 않았음(Servlet1)

※ redirect와 forward의 차이

    redirect는 각기 다른 request, response객체가 2쌍 필요하며, 브라우져의 URL이 바뀐다.
    forward한쌍의  request, response객체만 필요하며, 브라우져는 한번만 요청하기 때문에 URL이 바뀌지 않는다.  

RequestDispatcher가 있는 이유, sendRedirect() 와의 차이점

HttpServletResponse를 사용하면 sendRedirect() 메서드를 이용하여 지정한 경로로 제어를 이동시킬 수 있습니다. 그러나 sendRedirect()는 HTTP 리다이렉션을 이용하기 때문에 하나의 요청 범위 안에서 처리를 하는것이 아니라 브라우저에게 Response 후 브라우저측에서 지정받은 요청 경로로 다시 재요청을 하는 방식이기에 두 번의 HTTP 트랜잭션이 발생하며, 서버측에서는 최초에 받은 요청중에 처리한 내용을 리다이렉트 된 요청안에서 공유할 수 없는 문제가 있습니다. 

 
물론 sendRedirect() 에서도 쿠키나 세션등을 이용해 특정 상태를 유지하여 공유할 수는 있겠으나, 상황에 따라 제한적일 수 있으며, 코드 레벨 에서의 알고리즘 등을 곧바로 이어가는데에도 한계가 있기 때문에 좋은 방법이라고 할 수는 없을것입니다.

그대신 HttpServletResponse를 통해 redirect 하는 방식은 현재 어플리케이션 이외에 다른 자원의 경로를 요청할 수 있는 반면 RequestDispatcher는 현재 처리중인 서블릿이 속해 있는 웹 어플리케이션 범위 내에서만 요청을 제어할 수 있습니다.

출처: https://dololak.tistory.com/502 [코끼리를 냉장고에 넣는 방법]

'JSP&Servlet' 카테고리의 다른 글

Scope - Page, Request, Session, Application  (0) 2019.02.20
Servlet과 JSP의 연동  (0) 2019.02.19
JSP 문법과 내장객체  (0) 2019.02.18
JSP의 라이프사이클  (0) 2019.02.18
JSP  (0) 2019.02.18
Comments