포워드와 샌드 리다이렉트의 차이
포워드(forward)와 샌드 리다이렉트(sendRedirect)는 특정 URL로 접근시킬 수 있다. 단, 포워드는 웹서버에서 호출하고, 샌드 리다이렉트는 클라이언트 측에서 호출하게 만든다.
소스를 보면 큰 차이를 보인다.
1. 포워드
RequestDispatcher dispatcher = request.getRequestDispatcher(url);
dispatcher.forward(request, response);
2. 샌드 리다이렉트
response.sendRedirect(url);
포워드는 리퀘스트와 리스폰스가 있는 반면, 샌드 리다이렉트는 단 한 줄의 URL 밖에 없다. 다시 말해, 샌드 리다이렉트(sendRedirect)는 클라이언트가 직접 주소를 쳐서 들어가는 효과와 같다.
결론부터 말하면, 포워드는 리퀘스트/리스폰스의 어트리뷰트를 실어나르고 싶다면 써야한다. 샌드 리다이렉트는 그냥 이동시킬 때 쓴다.
이에 따라 아래와 같은 차이점을 갖는다.
차이점
1. 포워드는 웹페이지를 웹서버에서 호출하고, 샌드 리다이렉트는 클라이언트 측에서 http를 요청하게 만든다.
말 그대로다.
2. 포워드는 setAttribute로 소유한 객체를 실어나를 수 있으나, 샌드 리다이렉트는 텍스트만 보낼 수 있다.
말 그대로 샌드 리다이렉트는 사용자가 직접 주소를 치는 것과 똑같기 때문에, website.com/id=hong&name=홍길동 식으로 get방식처럼 주소를 보낼 수 밖에 없다.
3. 포워드는 request와 response째로 나르기 때문에 한글변환이 필요없다. 그러나 샌드 리다이렉트는 URI 인코딩이 필요하다.
website.com/id=hong&name=홍길동 같은 주소의 경우, 한글이 깨져나갈 수 있다. get방식에서 server.xml의 Connector부분에 URIEncoding=”UTF-8″ 추가하듯 인코딩을 해줘야 한다.
4. 포워드는 같은 웹 서버 내의 프로젝트만 호출할 수 있지만, 샌드 리다이렉트는 어떤 웹사이트 URL이든 갖다쓸 수 있다.