redirect
웹컨테이너는 sendRedirect() 메소드가 호출되면 브라우저에 응답을 보내는데
이 응답에는 브라우저가 웹 컨테이너의 응답을 받은 후 다시 요청을 보낼 새로운 URL이 포함되있다.
브라우저에서 완전히 새로운 요청을 하기때문에 요청속성으로 저장되있는 객체도 리다이렉트가 발생하기전에 소멸된다.
예를들어 a.jsp에서 request에 속성값을 담아 b.jsp 로 리다이렉트 시키면... 속성값이 b페이지에
전달되지않는다.(새로운요청을 하므로...)
forward
의 경우는 포워드를 사용하여 다른자원(jsp나 servlet)으로 요청을 보내어 처리하여도
클라이언트에는 이 사실을 알리지않는다(웹 컨테이너 내에서 처리된다)
리다이렉트와 달리 새로운 요청을 위한 클라이언트와의 통신이 없어서 좀더 나은 성능을 보여준다.
그리고 포워딩시에는 포워딩후에도 요청 속성에 있는 객체들을 사용할수 있다.
그러나 포워드를 클라이언트에 알리지 않으므로(웹 컨테이너에서만 사용하니까)
URL의 변화가 없다..
____________________________________________________________________________________________________________________________
하나의 Request 를 여러 컴포넌트가 공유해야 할 경우,
(예를 들면, 하나의 Servlet 에서 Client 의 인증과 권한 부여를 처리하는 경우 등)
Request 의 공유를 구현하는 방법
1. Web Container 가 Forward 로 처리하는 방법
2. Web Container 가 Redirect 로 처리하는 방법
Redirect
브라우저가 응답을 받은 후 다시 보낼 새로운 URL 포함.
완전히 새로운 요청을 하기 때문에 Request Attribute 가 가지고 있는 객체는 Redirect 발생 시 소멸된다.
추가적으로 발생한 왕복 처리 때문에 Forward 보다 느리다.
URL 에 파라미터가 보이므로, 중요한 정보는 포함하지 않도록 유의해야 한다.
(1) HTTP 요청
Browser (Client) ----------------> Web Container (Server)
==================== =========================
(2) 요청 처리
(3) 응답 Return
<----------------
(4) 새로운 요청
----------------->
(5) HTTP 응답
<----------------
사용 예 : response.sendRedirect (request.encodeRedirectURL ("http://xxxxxx/result.jsp?...")
Forward
Forward 되는 해당 요청이 다른 Servlet 에 전달된다.
이 때, Client 는 다른 Servlet 에서 이 요청을 처리할 것을 모른다.
Client 와 통신 없이 서버에서만 처리되기 때문에, Redirect 보다 더 나은 성능 보인다.
Forward 한 후에도 객체를 사용할 수 있으므로, 객체가 가지고 있던 Request Attribute 를 사용할 수 있다.
URL 에는 변화가 없으므로 URL 과 Client Application 이 일치하지 않을 수 있다.
이는 Forward 가 발생한 사실을 Client 가 알지 못하기 때문이다. Refresh 를 할 경우, 정확하지 않은 요청이 발생할 수 있다.
Struts Framework 는 기본으로 Forward 를 사용한다.
(1) HTTP 요청
Browser (Client) ----------------> Web Container (Server)
==================== =========================
(2) 요청 처리
(3) Forward 수행
(4) HTTP 응답
<----------------
사용 예 : RequestDispatcher dispatcher =
request.getRequestDispatcher("/result.jsp?....");
dispatcher.forward(request, response);
(RequestDispatcher.forward() 는 Client 에 어떠한 결과도 전달하지 않았을 경우 사용 가능하다.)
