2014년 2월 4일 화요일

Spring Redirect - FlashMap, RedirectAttributes

Spring MVC의 Controller에서 특정페이지 또는 다른 Controller로 Redirect 할 때 파라메터를 전달하는 방법은 크게 다른게 없었다. 이동하고자 하는 URL 뒤에 파라메터를 붙여주는 방법이다.

@RequestMapping(value="/create", method=RequestMethod.POST) public String setLicense( HttpServletRequest request, HttpServletResponse response) {

return "redirect:/springmvc/test?param=1"

}

간단하게 해결할 수 있는 방법이긴 한데 이럴 경우 Redirect 되는 페이지 주소에 파라메터 정보도 같이 붙어 나오게 된다. 왠지 정보를 숨기고 싶어서 생각할 수 있는 방법이 Session에 넣어두는 방법이다. Session에 정보를 넣었다가 뺐다가 해야 하는데 이것도 왠지 완벽하지 않다. 이런 문제점을 해결하기 위해서 Spring 3.1 부터는 Redirect 할 때 파라메터를 쉽게 전달할 수 있도록 RedirectAttributes , FlashMap 클래스를 제공한다. 먼저 RedirectAttributes를 사용하여 Redirect시 파라메터를 저장할 수 있는데 두가지 방법으로 가능하다. 첫번째 방법은 addAttribute 메소드로 값을 저장한다. 이 경우에 URL에 파라메터가 붙어 전달되게 된다. 그렇기 때문에 전달된 페이지에서 파라메터가 노출되게 된다. 두번째 방법은 addFlashAttribute 메소드로 Redirect 동작이 수행되기 전에 Session에 값이 저장되고 전달 후 소멸된다. Session을 선언해서 집어넣고 사용후 지워주는 수고를 덜어주는 아주 유용한 기능이라고 볼 수 있다. 다음은 사용 예이다.

@RequestMapping(value="/set", method=RequestMethod.GET)
public String set( RedirectAttributes redirectAttributes ) {

 //addAttribute로 전달할 값을 저장한다.
 redirectAttributes.addAttribute("notifications", "true");
 redirectAttributes.addAttribute("message", "success");

 //or

 //addFlashAttribute로 전달할 값을 저장한다.
 redirectAttributes.addFlashAttribute("notifications", "true");
 redirectAttributes.addFlashAttribute("message", "success");

 return "redirect:list";
}

@RequestMapping(value="/list", method=RequestMethod.GET)
public String get() {
 return "pages/testpage";
}

FlashMap에 값을 추가하고 가져올 수 있는 API도 제공하는데 RequestContextUtils 클래스의 메소드를 이용하여 데이터를 저장하고 꺼내올 수 있다. 아래는 사용 예이다.

@RequestMapping(value="/set", method=RequestMethod.GET)
public String set( HttpServletRequest request ) {
 //FlashMap에 전달할 값을 저장한다.
 FlashMap fm = RequestContextUtils.getOutputFlashMap(request);
 fm.put("notifications", "true");
 fm.put("message", "success");

 return "redirect:list";
}

@RequestMapping(value="/list", method=RequestMethod.GET)
public String get() {

 //FlashMap에 저장되어 전달된 값을 가져온다.
 Map flashMap = RequestContextUtils.getInputFlashMap(request);
 if(flashMap !=null) {
 System.out.println( (String)flashMap.get("notifications") );
 System.out.println( (String)flashMap.get("message") );
 }
 return "pages/testpage";
}

댓글 없음:

댓글 쓰기