forward
: 서버 내에서 처리할 페이지를 연결해 주는 작업-
request
,response
객체가 있을때forward
하는 방법
request.getRequestDispatcher("foward_ret") .forward(request, response);
요청정보에서 forwarding 페이지에 해당하는 새로운 requestDispatcher를 꺼내서 forward 메서드에 요청정보와 응답정보를 모두 집어넣는다.
즉, foward_ret의 매핑은 forward가 받은 요청정보 혹은 forward에서 새롭게 추가된 요청 정보를 활용할 수 있다.
브라우저의 입장에서 요청을 forward로 한 것이기 때문에 브라우저의 url은 변경되지 않는다.
redirect
: 브라우저에게 새로운 요청을 요구하는 작업- request, response객체가 있을때 redirect하는 방법
response.sendRedirect("redirect_ret");
응답정보만을 가지고 sendRedirect해버린다.
브라우저에서 새로운 요청을 한 것이기 때문에 브라우저의 url도 변경이되고 데이터를 전달할 수 없다.
redirect
를 사용하여 페이지 이동을 할 경우, 네트워크상에서 데이터를 유실하므로 서블릿간 이동을 통해 데이터를 이동해야할 땐 반드시 forward
를 사용해야한다.package com.example.demo.controller; import com.example.demo.entity.User; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; @Slf4j @Controller public class HomeController { @PostMapping(value = "/forward") public String forward(@ModelAttribute User user) { log.info("forward, {}", user); return "forward:/forward_ret"; } @PostMapping(value = "/forward_ret") public String forward_ret(){ return "user"; } @PostMapping(value = "/redirect") public String redirect(@ModelAttribute User user){ log.info("redirect, {}",user); return "redirect:/redirect_ret"; } @GetMapping(value = "/redirect_ret") public String redirect_ret(Model model){ if(model.getAttribute("user")==null){ model.addAttribute("user", new User("no user object in model",11)); } return "user"; } }
<!DOCTYPE html> <html lang="kr"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="forward" method="post"> 이름 : <input type="text" name="name"/> <br> 나이 : <input type="text" name="age"/> <input type="submit" value="포와드"> </form> <form action="redirect" method="post"> 이름 : <input type="text" name="name"/> <br> 나이 : <input type="text" name="age"/> <input type="submit" value="리다이렉트"> </form> </body> </html>
포와딩 시연

→


리디렉션 시연

→


첫번째 요청인 redirect의 응답을 살펴보자

PRG
패턴 - POST -> REDIRECT -> GET
주문 POST → Rdirect X
POST →광클 → 주문 400개