redirect의 구조는
처음에 sub13을 redirect 하는 /main16/sub12를 요청을 하면 바로 sub13으로 넘어가는게 아닌
server를 한번 걸쳐서 302 응답코드를 받고
다시 client에서 /main16/sub13에 대한 request를 요청한다.
그래서 /main16/sub12 의 값을 redirect 되는 sub13에 사용하고 싶다면
방법은 크게 세가지로 나뉜다
1. 쿼리스트링에 담아서 보내기
@GetMapping("sub12")
public String method12(String email){
return "redirect:/main16/sub13?p=" + email;
}
2. HttpSession 객체 사용(비권장)
@GetMapping("sub12")
public String method12(String name, HttpSession session){
// HttpSession 객체에 값 넣어주기
session.setAttribute("name", name);
return "redirect:/main16/sub13";
}
@GetMapping("sub13")
public void method11(HttpSession session, Model model){
// sub12 session에서 보낸 setAttribute 데이터를 받는다
Object name = session.getAttribute("name");
// view에서 사용하려면 model에 넣어서 사용
model.addAttribute("name", name);
}
3. RedirectAttributes 객체 사용 (권장)
addFlashAttribute() 메소드는 세션에 잠깐 데이터를 넣었다가
redirect 경로 Model 객체에 넣어주고 사라짐
HttpSession 객체 대신 RedirectAttributes 사용 권장
addFlashAttribute() - redirect 경로 도착지의 Model에 붙음
@GetMapping("sub12")
public String method14(String[]foodList, RedirectAttributes reAttr){
// HttpSession 객체 대신 RedirectAttributes 객체 사용해서 데이터 넣기
reAttr.addFlashAttribute("foodList", foodList);
return "redirect:/main16/sub13";
}
@GetMapping("sub13")
public void method15(Model model){
// sub12의 addFlashAttribute값 가져오고
Object foodList = model.getAttribute("foodList");
// sub13 model에 넣어서 사용
model.addAttribute("foodList", foodList);
// 템플릿 엔진에서 사용하려면 굳이 model.get / set 안해도
// 바로 템플릿 엔진에서 데이터 사용 가능
}
addFlashAttribute 동작 순서 -> session에 잠깐 담겼다가 -> redirect경로의 Model 객체에 담긴다
템플릿 엔진에서 바로 사용하려면 굳이 메소드안에 model.getAttribute, setAttribute 안해도됨
addAttribute() - redirect 경로 도착지의 쿼리스트링에 붙음
@GetMapping("sub16")
public String method16(RedirectAttributes rttr){
rttr.addAttribute("attr1", "쿼리스트링에 붙음");
return "redirect:/main16/sub17";
}
반응형
'Spring Boot > controller' 카테고리의 다른 글
redirect (0) | 2023.09.27 |
---|