본문 바로가기

Tip

[spring] get 방식 url 없애기(controller에서 redirect 다루기)

프로젝트 중 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";

}

 

 

감사합니다.

출처 : galid1.tistory.com/563