IT/SpringBoot
Redirect, forward, RedirectAttributes
WsCode
2022. 1. 23. 16:38
redirect
@GetMapping("/init")
public void init(Model model, HttpServletResponse response) throws IOException{
response.sendRedirect("/redirect");
}
@ResponseBody
@GetMapping("/redirect")
public String redirect() {
return "result : redirect!!!";
}
Redirect를 사용하다보면 데이터를 전송하지 못한다는 단점이있습니다. 리다이렉트는 호출 시 클라이언트를 한번 갔다가 호출되기때문에 request에 데이터가 담겨있지않게됩니다.
이때 데이터를 전송시키고싶다! 이럴때 forward를 사용하면 데이터를 전달할수 있습니다. forward는 서버에서만 처리하기때문에 데이터가 존재하죠.
forward
@ResponseBody
@GetMapping("/init")
public void init(HttpServletRequest request,
HttpServletResponse response,
Model model) throws Exception {
request.setAttribute("value1", "A");
request.setAttribute("value2", "B");
RequestDispatcher reqDispatcher = request.getRequestDispatcher("/redirect");
reqDispatcher.forward(request, response);
}
@ResponseBody
@GetMapping("/redirect")
public String redirect(HttpServletRequest request) {
log.info("value1 : " + request.getAttribute("value1"));
log.info("value2 : " + request.getAttribute("value2"));
return "OK!";
}
꼭 리다이렉트를 사용하여 페이지를 이동해야하며 데이터를 꼭 받아야한다면 방법이있습니다.
RedirectAttributes(url 노출)
@GetMapping("/init")
public String init(RedirectAttributes rab) {
// GET
rab.addAttribute("value1" , "A");
rab.addAttribute("value2" , "B");
return "redirect:/redirect";
}
@ResponseBody
@GetMapping("/redirect")
public String redirect(@RequestParam String value1, @RequestParam String value2) {
log.info("value1 : " + value1);
log.info("value2 : " + value2);
return "result : redirect!!!";
}
위처럼 데이터를 받아서 사용해도되지만 url에 노출된다는 단점이있습니다.
RedirectAttributes를 사용하지만 url에 노출되기 싫은 상황에는 아래와같이 사용하시면됩니다.
RedirectAttributes(url 노출X)
@GetMapping("/init")
public String init(RedirectAttributes rab) {
// POST
rab.addFlashAttribute("value1" , "A");
rab.addFlashAttribute("value2" , "B");
return "redirect:/redirect";
}
@ResponseBody
@GetMapping("/redirect")
public String redirect(HttpServletRequest request) {
Map<String, ?> redirectParam = RequestContextUtils.getInputFlashMap(request);
log.info("value1 : " + redirectParam.get("value1"));
log.info("value2 : " + redirectParam.get("value2"));
return "result : redirect!!!";
}
여담 )
@GetMapping("/init")
public String init(Model model) {
return "redirect:/redirect";
}
@ResponseBody
@PostMapping("/redirect")
public String redirect() {
return "result : redirect!!!";
}
리다이렉트 호출시에는 꼭 GET방식만되니 GetMapping로 맵핑해주세요. post로 받으시면 405에러가 떨어집니다.