프로젝트 중 pageIndex나 어떤 id 등 필요한 값들을 지속적으로 유지해야하는 경우,
url에 parameter가 길게 붙어있는게 사용자가 url에 param값을 수정해서 볼 수도 있다고 생각이 들음.
물론 서버사이드에서 사용자 권한이나 다른 기능(?)을 이용해서 막을 수 있지만 약간 땜빵(?)식으로 처리하고 싶고
가능한지 궁금했음
아래 내용대로 해도 유지할 값들을 가지고 다닐 수도 있지만
input type="hidden"으로 사용한다면 get방식이 아닌 post로 보내도 url에 안보이고 값 유지됨
상황에 맞게 사용하면 될 것 같다..(예전 스타일인가..)
------------------------------------------------------------------------------------------------------------------------------
RedirectAttributes?
Handler에서 요청을 처리한 뒤 redirect를 하는 경우가 있습니다. 예를 들면 중복 서브밋을 방지하기 위해 postHandler의 경우 getHandler로 redirect를 하는 등의 경우가 있습니다. 이 때 어떤 데이터를 같이 전달하고 싶은 경우 데이터를 전달하는 방법은 session, requestParameter 등이 있습니다.
하지만 session의 경우에는 한 클라이언트(브라우저)가 종료하기 전까지 유지해야하는 데이터(로그인 여부, 장바구니 등)을 담아야 하기 때문에, redirect를 할 때에 session에 데이터를 담는 것은 올바르지 않을 수 있습니다.
@GetMapping("/test")
public String getRedirect(Model model) {
model.addAttribute("name", "jjy");
model.addAttribute("age", 10);
return "redirect:/redirect";
}
// 자동으로 다음과 같이 요청 -> /redirect?name=jjy&age=10
이런 경우 때문에 springMVC에서는 위와 같이 model에 data를 담고 Redirect를 하는 경우, Primitive Type(기본자료형)에 한해서 자동으로 url의 Parameter로 추가해서 데이터를 넘겨 주었습니다.
SpringBoot의 경우에는 이 기능이 off가 되어있습니다. RedirectAttributes 매개변수를 핸들러에 추가하여 원하는 데이터만을 선택적으로 Redirect 시 전달할 수 있습니다.
FalshAttributres?
redirect 시 Primitive Type이 아닌 Object를 전달하고 싶은 경우도 있을 것입니다. 이 때 사용할 수 있는 것이 바로 FlashAttributes 입니다. FlashAttributes는 RedirectAttributes와 마찬가지로 Session에 데이터를 담는 것이 올바르지 않을 때 사용할 수 있습니다만, 사실 FlashAttributes도 Session을 이용해서 데이터를 전달합니다.
조금 자세히 설명드리자면, Redirect 시 Parameter로 데이터를 전달하는 것은 문자열로 데이터가 넘어가기 때문에 Object를 전달하는데 어려움이 있습니다. 이 때문에 FlashAttributes를 사용합니다. 또 FlashAttributes는 Session을 이용하여 데이터를 전달하는데요, 이때 넘겨받은 핸들러에서만 사용이 가능하고, 넘겨받은 핸들러가 종료될때 Session에서 FlashAttributes에 저장된 데이터를은 삭제가 됩니다.
예제
@GetMapping("/get")
public String get(RedirectAttributes rttr) {
Event event = new Event();
event.setName("jjy");
event.setAge(10);
rttr.addFlashAttributes("event", event);
return "redirect:/redirect";
}
@GetMapping("/redirect")
@ResponseBody
public String redirect(@ModelAttribute Event event) {
System.out.println(event.toString());
return "ok";
}
감사합니다.
'Tip' 카테고리의 다른 글
리눅스 심볼릭링크 설정 (0) | 2021.02.24 |
---|---|
[oracle] 오라클 to_char to_date locale 문제(literal does not match format string ora-01861) 리눅스 캐릭터셋 변경 (0) | 2021.02.24 |
file drag drop 파일 드래그앤드롭 구현 (0) | 2021.02.23 |
[spring-security] LoginVO에 변수 추가 (0) | 2021.02.23 |
[jquery] 동적으로 html table(테이블) 생성 속도 (0) | 2021.02.23 |