twocowsong

Redirect, forward, RedirectAttributes 본문

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!";
}

forward를 사용하여 데이터를 받은모습

 

꼭 리다이렉트를 사용하여 페이지를 이동해야하며 데이터를 꼭 받아야한다면 방법이있습니다.

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에 노출된다는 단점이있습니다.

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!!!";
}

URL로 데이터가 노출되지않는 상황


여담 )

@GetMapping("/init")
public String init(Model model) {
    return "redirect:/redirect";
}

@ResponseBody
@PostMapping("/redirect")
public String redirect() {
    return "result : redirect!!!";
}

 

리다이렉트 호출시에는 꼭 GET방식만되니 GetMapping로 맵핑해주세요. post로 받으시면 405에러가 떨어집니다.

405 에러가 리턴된 상황

 

'IT > SpringBoot' 카테고리의 다른 글

@RestController @Controller  (0) 2022.01.24
@Scheduled  (0) 2022.01.23
@ModelAttribute, @PathVariable, @RequestBody  (0) 2022.01.18
@Data  (0) 2022.01.18
@Value 어노테이션  (0) 2022.01.18